mysql workbench explain plan




選擇所有列對性能不利? (2)

選擇單個列可能會對某些查詢的性能產生很大的影響。 例如,查詢引擎處理索引而不是在原始數據頁面中查找數據會更高效。 如果覆蓋索引可用 - 即包含查詢所需的所有列的索引 - 則查詢將運行得更快。 對於那些容量可用的大型表而言,使用覆蓋索引可能是一個巨大的勝利。 (在某些情況下,請考慮性能的提高幅度。)

另一個有限數量的列是有利的情況是當一個或多個列非常大時,如BLOB或TEXT列。 這些可以增長到數万字節甚至兆字節。 檢索它們並在服務器上施加很大的負載。

如果您已經準備好語句並且表格的基礎結構發生了變化,那麼使用*會有危險。 查詢本身可能會過時(我在其他數據庫上有這個問題,但不是特別在MySQL上)。 基本的變化可以像更改列的名稱一樣簡單。 作為編譯時錯誤會被捕獲的是一個運行時錯誤,可能會更神秘。

一般來說,避免*的原因更多的與網絡性能有關。 在很多情況下,這不會有太大的變化。 如果從每行所包含的平均值為100或200字節的表中返回20行,那麼在大多數硬件環境中,選擇所有列和列的子集之間的區別將是次要的。 查詢花費的大部分時間將用於編譯查詢,在引擎中執行查詢以及讀取數據頁面。 返回200字節或2000字節之間的差異可能不會有很大的區別。

但是,有些情況下(如上面列出的)可以產生很大的變化。 所以,避免*是一個好習慣,但現在使用它可能不會導致您的系統。

一次SELECT所有的列是不是很糟糕,儘管你可能不需要全部列。 然而,你可能需要他們在另一個任務,但你懶惰地寫每個任務的查詢。

你是否應該只查詢你在哪裡只SELECT你需要的列,如果你需要另外的列再做這個查詢?

所以基本上是這樣的問題:是否對性能有任何影響SELECT一列vs多列?

查詢非常簡單(沒有函數,連接等)例如:

SELECT
id, name, status, date
FROM user_table
WHERE user_id = :user_id

這裡的問題不是數據庫服務器的問題,而僅僅是網絡通信。 通過一次選擇所有的列,你告訴服務器一次返回給你所有的列。 關於IO的問題以及所有這些,在問題和答案中都很好地解決了@Karamba在評論中給出了: select * vs select列 。 但是對於大多數真實世界的應用程序(我從各方面都使用“應用程序”),主要關心的只是網絡流量以及序列化,傳輸和反序列化數據需要多長時間。 雖然真的,但答案是一樣的。

因此,如果您打算全部使用它們,那麼拉回所有列是非常好的,但是這可能會導致大量額外的數據傳輸,特別是在您的列中存儲冗長的字符串時。 當然,在很多情況下,這種差別是無法察覺的,主要是一個原則問題。 不是全部,而是絕大多數。

這實際上只是你前面提到的懶惰(相信我,我們都這樣認為)和性能真的有多重要。

這一切都說,如果你打算使用所有的列值,你最好把他們都拉回來,然後你提交一堆查詢。

把它想像成一個網絡搜索:你做搜索,找到你的頁面,而你只需要一個細節。 您可以閱讀整個頁面,了解有關該主題的所有內容,也可以跳到關於您要查找和完成的部分。 如果這是你想要的,那麼後者會快得多,但是如果你不得不去了解其他方面的知識,那麼第一次閱讀它們會比再次搜索找到更好的方式,該網站來談談它。

如果您不確定將來是否需要其他列值,那麼這是您作為開發人員進行調用以獲取更大可能性的呼叫。

這一切都取決於你的應用程序是什麼,你的數據是什麼,你如何使用它,以及性能真正對你有多重要。





select