2014-03-13 10 views
6

它會在網頁加載時產生明顯的差異嗎?平均而言,我的表格有10列,如果我只需要其中3列,我應該在查詢中調用這些列以使其更快?SELECT *確實需要更多時間而不是隻選擇所需的列嗎?

+1

你從基準測試中看到了什麼? – JoelFan

+0

時差可能很小,並可能被其他因素淹沒,因此用戶可能不會注意到這一點(但它可能會與多個用戶加在一起並變得至關重要)。如果您返回大量不需要的數據(例如,存儲在字段中的圖像),則可能是主要異常。但是,調試,維護和可靠性可能是避免使用SELECT *的更好理由。 – Kickstart

+0

0.723秒vs 0.0717秒,其中我總結了三列131,563行數據。這不是沒有區別嗎? –

回答

2

是的,如果你只需要一些列,只選擇那些。下面是一些原因:

  1. 最明顯的:額外數據需要被髮送回製造用於較大的分組要傳送(或通過本地套接字管)。這會增加整體延遲。對於1行或2行,這可能看起來並不多,但要等到您有100行或1000行... 7個額外的數據列將明顯影響整體傳輸延遲,特別是如果最終導致必須破壞結果集進入更多的TCP數據包進行傳輸。這可能不是這樣的問題,如果你打到本地主機套接字,但將你的數據庫移動到服務器通過網絡,到另一個數據中心等......並且影響將是白天!
  2. 在啓用MySQL查詢緩存的情況下,將不需要的數據存儲在結果集中會增加您的超高速緩存空間需求 - 較大的查詢緩存可能會遇到性能問題。
  3. 巨大的挑戰可能是:如果您只需要作爲覆蓋索引一部分的列,那麼執行select *將需要對主表中其餘數據字段進行跟蹤點查找,而不僅僅是使用來自索引表。
1

是的,你應該。

在select中使用命名列是出於多種原因使用數據庫的最佳實踐。

只有所需的數據從數據庫傳輸到應用程序服務器,從而減少了cpu,內存和磁盤使用量。

它有助於檢測編碼錯誤和結構變化。

只有少數情況下,使用select *是一個好主意,在所有其他查詢中請自己幫忙併使用列名稱。

2

比方說你有一個表,1000列,而你只需要3

你覺得會跑得更快,爲什麼?

此:SELECT * FROM table_name;

或本:SELECT col1, col2, col3, FROM table_name;

當您使用*現在你持有的是整個選擇(或大或小)在內存中。選擇越大...其使用/需要的內存越多。

所以,即使您的表不一定很大,我仍然只會選擇您實際需要的數據。你甚至可能沒有注意到速度上的差異,但它肯定會更快。

6

請問可辨別的區別。在大多數情況下可能不會。這裏有一些情況可能會造成很大的差異:

  • 7個不需要的列確實非常大。
  • 你正在返回很多很多的行。
  • 你有一個大表,越來越多的行和索引可從3列,但不是10

但是,還有其他原因不使用*

  • 它將在編譯查詢時根據數據庫中列的順序來替換列。如果表格的結構發生變化,這可能會導致問題。
  • 如果列名稱更改或被刪除,您的查詢將工作,並且後續代碼可能會中斷。如果您明確列出列,那麼查詢將會中斷,使問題更容易被發現。
  • 鍵入三列名稱不應該是一個大問題。明確列出列會使代碼更具信息性。
+1

訂購和驚喜代碼打破的好處。這也是一個問題,如果你正在像''row [0]''這樣的非關聯數組中訪問數據,那麼PHP代碼可能不會中斷,但是你可能會得到意想不到的結果。想象一下表{name,credit_card_number,email}被查詢以顯示用戶的電子郵件地址,並且有人在'name'後面添加一列,現在'echo $ row [2]'顯示信用卡號碼 – Ray

0

它的缺點是,如果你要返回更多的數據,將需要更長的時間。這可能是一個非常非常微小的時間,但是會花費更長的時間。如上所述,在生產環境中,選擇*可能是危險的,您可能不是設計/實現數據庫的人員。如果您認爲列以特定順序返回,或者數據庫結構屬於特定類型,然後DBA進入並進行某種更改並且不通知您,那麼您的代碼可能存在問題。

0

這個差別是非常小的,但是有一個細微的差別,我認爲它的確取決於幾個因素,哪個更快。

1)表中有多少列?

2)您實際需要抓取多少列?

3)您抓取了多少條記錄?

在你的情況,根據你說的有10列,只需要這些列的3什麼的,我懷疑它會有所作爲,如果你使用'Select *'與否,除非也許你抓住的數千數萬記錄。但在更極端的情況下,涉及更多的列時,我發現'Select *'稍微快一點,但在所有情況下可能都不是這樣。

我曾經在一個超過150列的SQLite表中做了一些速度測試,我只需要抓取大約40列,我需要所有20,000多條記錄。速度差異非常小(我們談論20到40毫秒的差異),但實際上從所有列中獲取數據的速度更快,其中'SELECT ALL *'而不是'Select All Field1, Field2, etc'

我假設表格中的記錄和列數越多,這個例子的速度差異就越大。但是如果你只需要一個巨大的表中的3列,我猜想只需抓住這3列就會更快。但是,如果您真的關心'Select *''Select field1, field2, etc'之間的最小速度差異,那麼請做一些速度測試。

0

是的。 *將被所有列名取代。之後只有執行開始。例如,如果表中有3列a,b,c ..選擇a,b,c直接開始執行,其中select *開始將查詢轉換爲select a,b,c之後,僅執行統計信息。

相關問題