它會在網頁加載時產生明顯的差異嗎?平均而言,我的表格有10列,如果我只需要其中3列,我應該在查詢中調用這些列以使其更快?SELECT *確實需要更多時間而不是隻選擇所需的列嗎?
回答
是的,如果你只需要一些列,只選擇那些。下面是一些原因:
- 最明顯的:額外數據需要被髮送回製造用於較大的分組要傳送(或通過本地套接字管)。這會增加整體延遲。對於1行或2行,這可能看起來並不多,但要等到您有100行或1000行... 7個額外的數據列將明顯影響整體傳輸延遲,特別是如果最終導致必須破壞結果集進入更多的TCP數據包進行傳輸。這可能不是這樣的問題,如果你打到本地主機套接字,但將你的數據庫移動到服務器通過網絡,到另一個數據中心等......並且影響將是白天!
- 在啓用MySQL查詢緩存的情況下,將不需要的數據存儲在結果集中會增加您的超高速緩存空間需求 - 較大的查詢緩存可能會遇到性能問題。
- 巨大的挑戰可能是:如果您只需要作爲覆蓋索引一部分的列,那麼執行
select *
將需要對主表中其餘數據字段進行跟蹤點查找,而不僅僅是使用來自索引表。
是的,你應該。
在select中使用命名列是出於多種原因使用數據庫的最佳實踐。
只有所需的數據從數據庫傳輸到應用程序服務器,從而減少了cpu,內存和磁盤使用量。
它有助於檢測編碼錯誤和結構變化。
只有少數情況下,使用select *是一個好主意,在所有其他查詢中請自己幫忙併使用列名稱。
比方說你有一個表,1000列,而你只需要3
你覺得會跑得更快,爲什麼?
此:SELECT * FROM table_name;
或本:SELECT col1, col2, col3, FROM table_name;
當您使用*
現在你持有的是整個選擇(或大或小)在內存中。選擇越大...其使用/需要的內存越多。
所以,即使您的表不一定很大,我仍然只會選擇您實際需要的數據。你甚至可能沒有注意到速度上的差異,但它肯定會更快。
請問可辨別的區別。在大多數情況下可能不會。這裏有一些情況可能會造成很大的差異:
- 7個不需要的列確實非常大。
- 你正在返回很多很多的行。
- 你有一個大表,越來越多的行和索引可從3列,但不是10
但是,還有其他原因不使用*
:
- 它將在編譯查詢時根據數據庫中列的順序來替換列。如果表格的結構發生變化,這可能會導致問題。
- 如果列名稱更改或被刪除,您的查詢將工作,並且後續代碼可能會中斷。如果您明確列出列,那麼查詢將會中斷,使問題更容易被發現。
- 鍵入三列名稱不應該是一個大問題。明確列出列會使代碼更具信息性。
訂購和驚喜代碼打破的好處。這也是一個問題,如果你正在像''row [0]''這樣的非關聯數組中訪問數據,那麼PHP代碼可能不會中斷,但是你可能會得到意想不到的結果。想象一下表{name,credit_card_number,email}被查詢以顯示用戶的電子郵件地址,並且有人在'name'後面添加一列,現在'echo $ row [2]'顯示信用卡號碼 – Ray
它的缺點是,如果你要返回更多的數據,將需要更長的時間。這可能是一個非常非常微小的時間,但是會花費更長的時間。如上所述,在生產環境中,選擇*可能是危險的,您可能不是設計/實現數據庫的人員。如果您認爲列以特定順序返回,或者數據庫結構屬於特定類型,然後DBA進入並進行某種更改並且不通知您,那麼您的代碼可能存在問題。
這個差別是非常小的,但是有一個細微的差別,我認爲它的確取決於幾個因素,哪個更快。
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'
之間的最小速度差異,那麼請做一些速度測試。
是的。 *將被所有列名取代。之後只有執行開始。例如,如果表中有3列a,b,c ..選擇a,b,c直接開始執行,其中select *開始將查詢轉換爲select a,b,c之後,僅執行統計信息。
- 1. 啓動時選擇功能需要更多時間
- 2. ExpectedConditions.InvisibilityOfElementLocated需要更多時間
- 3. 正常選擇查詢需要更多時間
- 4. 需要選擇列表中顯示的值,而不是文本
- 5. 什麼是更快的SELECT *或SELECT`field`,只需要'field`
- 6. 選擇查詢需要很長時間
- 7. 我需要更多空間嗎?
- 8. ELEM比賽是返回的所有數據,而我只需要選擇數據
- 9. NHibernate QueryOver只選擇需要的模型
- 10. Silverlight是我需要的正確選擇嗎?
- 11. 是否需要在羣體時間選擇一個默認值,而不是組合框的稍後時間?
- 12. Datetiime列需要只顯示時間
- 13. Python多處理需要更多時間
- 14. 更新ListView時確實需要notifyDataSetChanged()
- 15. 加入查詢需要更多時間
- 16. wpf-不需要的選擇更改
- 17. 計時器需要更多時間
- 18. jquery slideToggle打開所有div而不是隻需要的div
- 19. 簡單的選擇需要很多時間來執行
- 20. 查詢bigquery需要更多時間
- 21. SELECT需要100ms;創建表爲選擇 - 或 - 插入選擇需要15分鐘
- 22. 爲什麼LINQ需要更多的時間來執行而不是foreach?
- 23. 不存在於更新語句需要更多的時間
- 24. SelectedIndexChanged需要很多時間
- 25. Angularjs Dropdown多選選擇需要很長時間加載
- 26. '鎖'需要CPU時間嗎?
- 27. 我需要選擇而不是回聲/打印
- 28. HTML表格需要列之間的間距,而不是行
- 29. 選擇需要的可用空間
- 30. Selenium-webdriver幫助需要與選擇下拉菜單,而不是選擇選項
你從基準測試中看到了什麼? – JoelFan
時差可能很小,並可能被其他因素淹沒,因此用戶可能不會注意到這一點(但它可能會與多個用戶加在一起並變得至關重要)。如果您返回大量不需要的數據(例如,存儲在字段中的圖像),則可能是主要異常。但是,調試,維護和可靠性可能是避免使用SELECT *的更好理由。 – Kickstart
0.723秒vs 0.0717秒,其中我總結了三列131,563行數據。這不是沒有區別嗎? –