MySQL EXPLAIN - 效能分析語句
有時候在開發程式會遇到一些效能上的瓶頸,可能是 SQL 語法下的不好或者是索引建立不當所造成,不過在初期開發資料量不大的時候,可能無法明顯的感覺到效能上的差異,我們可以透過 EXPLAIN 語句來分析查詢語句的效能,確保在開發初期就能使用有效率的 SQL 語句。EXPLAIN 用法如下
1 | EXPLAIN [EXTENDED] SELECT select_options |
簡單的說,就是在你的查詢 SELECT 語法之前加上 EXPLAIN 就可以了
現在我們建立一個資料表 users 與一些測試資料如下
1 | CREATE TABLE `users` ( |
一開始我們除了 id 使用 PRIMARY KEY 之外其他欄位都沒有建立索引,接著我們實際下一些指令來測試
1 | EXPLAIN SELECT * FROM `users` WHERE name = 'tom' |
結果
1 | EXPLAIN SELECT * FROM `users` WHERE id = 3 |
結果
使用 EXPLAIN 語句後,會輸出一些分析數據,其中最主要看的是 rows 這個欄位,當我們搜索 name 時,由於沒有建立索引,所以他 SCAN 整個資料表總共跑了 4 次,相反的搜索 id 時則只跑了 1 次;所以可以簡單的把 rows 視為執行效能,越少越好。
我們進一步建立另一個資料表來做關聯測試
1 | CREATE TABLE `articles` ( |
假設我們想要找到使用者 ID=1 的人 2011 年 10 月之後有哪些文章,我們用了下面兩種不同語句來查詢
1 | EXPLAIN SELECT * FROM `users` a, `articles` b WHERE b.date > '2011-10' AND a.id = b.user_id AND b.user_id = 1 |
結果
1 | EXPLAIN SELECT * FROM `users` a, (SELECT * FROM `articles` WHERE date > '2011-10') b WHERE a.id = b.user_id AND b.user_id = 1 |
結果
雖然這兩個查詢的結果一樣,但是分析他們的效能會發現有明顯的不同,所以透過 EXPLAIN 的語句可以比較不同方式的查詢以得到改進。
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 小殘的程式光廊!
Comment