如何將你的 MySQL 查詢速度提公升 300 倍

2021-07-31 23:11:35 字數 1285 閱讀 4188

在進行效能分析前,需要先定位耗時查詢。

mysql提供了內建的耗時查詢日誌。使用前,開啟my.cnf檔案,將slow_query_log設定為"on"。同時將long_query_time設定為乙個對一次查詢來說比較慢的時間(秒數),比如0.2。slow_query_log_file設定為你想儲存日誌檔案的路徑。然後執行**,執行時間超過設定上限的查詢將會被記錄到日誌中。

一旦定位這些煩人的查詢,就可以**慢的原因。mysql提供了explain關鍵字。可以與select、delete、insert、replace、update語句一起使用。只需要如下一樣新增到查詢開始處:

explain select picture.id, picture.title

from picture

left join album on picture.album_id = album.idwhere album.user_id = 1;

結果是對資料訪問過程的解析。每行代表乙個查詢相關的資料表:

重點是表名、使用的key、查詢執行時所掃瞄的行數。

這個查詢掃瞄了picture表2百萬行,對每個picture記錄掃瞄了album表2萬行。意味著,該查詢實際掃瞄了album表400億行。這個過程可以更高效。

索引

使用索引,可以極大提公升效能。比如位址簿中的名字。找乙個名字,你可以從頭翻到尾,也可以找到相應的字元標籤頁來快速定位。

使用索引可以避免無必要的表掃瞄。比如在picture.album_id上新增索引:

alter table picture add index(album_id);

現在執行查詢,就不會掃瞄整個picture列表了。首先,所有的album表會被掃瞄以找到屬於該使用者的album,然後,使用album_id列索引快速定位對應的picture。掃瞄的行數減少到了20萬,比原始查詢快了317倍。

按照以下方式新增索引可以確保兩張表都能使用對應鍵:

alter table album add index(user_id);

這次,album表不會被全部掃瞄,通過user_id鍵就可以精確定位相應的album。然後這100個album被掃瞄後,通過album_id鍵相關的picture也可以快速找到。每張表都用到了乙個鍵進行查詢效能優化,結果比原始查詢快了380倍。

但是並不意味著可以隨意新增索引,因為索引會導致寫資料庫用時增長。所以使用索引導致讀用時縮短,寫用時增長。因此,如果能提公升讀效能時再新增索引。使用explain來確認索引是否被查詢用到,沒有就刪除。

文章原址:

如何將你的 MySQL 查詢速度提公升 300 倍

在進行效能分析前,需要先定位耗時查詢。mysql提供了內建的耗時查詢日誌。使用前,開啟 my.cnf 檔案,將 slow query log 設定為 on 同時將 long query time 設定為乙個對一次查詢來說比較慢的時間 秒數 比如0.2。slow query log file 設定為你...

如何將你的vim配置的「高大上」

vim對於乙個經常在linux進行程式設計的程式設計師,將vim 配置的高大上是乙個程式設計師的基本素養。接下來就來給大家介紹一下如何簡單的配置vim 首先來上一張效果圖 配置檔案的位置 在目錄 etc 下面,有個名為vimrc的檔案,這是系統中公共的vim配置檔案,對所有使用者都有效。而在每個使用...

如何將你的應用遷移到Python3的三個步驟

python 2.x 很快就要 失去官方支援 了,儘管如此,從 python 2 遷移到 python 3 卻並沒有想象中那麼難。我在上週用了乙個晚上的時間將乙個 3d 渲染器的前端 及其對應的 pyside 遷移到 python 3,回想起來,儘管在遷移過程中無可避免地會遇到一些牽一髮而動全身的修...