一條MySQL的select語句,為什麼性能會差別這麼大?
01-26
用MySQL管理一張表有近1億條記錄。這張表假設名字是A,
create table `A` ( `A_ID` bigint not null auto_increment, `OBJ` integer not null, `B_ID` bigint not null,`C` varchar(64) not null,
`D` varchar(50) not null, `E` varchar(50) not null, `F` datetime, `G` varchar(16) not null, primary key (`A_ID`), unique (`B_ID`, `E`), KEY `IDX1` (`C`,`E`, `G`), KEY `IDX2` (`C`,`D`, `G`), KEY `IDX3` (`G`),KEY `IDX4` (`F`)
) engine=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;其中B_ID作為外鍵,指向B表的如果select這麼寫:SELECT `A_ID`, `B_ID` FROM `A` WHERE `C` = "xxx" AND `E` = "yyy" AND `G` = "zzz" LIMIT 1;沒有問題。如果select這樣寫:SELECT `A_ID` FROM `A` WHERE `C` = "xxx" AND `E` = "yyy" AND `G` = "zzz" LIMIT 1;要花費5秒鐘。就是少查了一個欄位,怎麼會影響到性能?哪位大牛解釋一下原因,謝謝!
可以用EXPALIN 語句看看語句性能分析情況
用法是EXPLAIN SELECT XXXXXXXXXXXX;也就是在你的語句前加EXPLAIN另外或許題主是先執行語句二,然後執行語句一的,在這種情況下,語句二是沒有緩存的,它執行過後會產生緩存,再執行語句一就會用到緩存,也就快得多了你可以將執行計劃列印出來看下,再分析;
其實第一條語句:SELECT `A_ID`, `B_ID` FROM `A` WHERE `C` = "xxx" AND `E` = "yyy" AND `G` = "zzz" LIMIT 1;只用了一個常量KEY IDX1 (C,E, G);而第二條語句:
SELECT `A_ID` FROM `A` WHERE `C` = "xxx" AND `E` = "yyy" AND `G` = "zzz" LIMIT 1;
除了用了常量KEY IDX1 (C,E, G)之外,還用了primary key (A_ID);在數據量在一定範圍內的時候,第一條語句執行時間少,但是如果數據量大的時候第二條語句會快很多。參考自:MySQL單元素索引的範圍訪問方法這個語句的where條件決定了一定要走索引。第二個句子查詢列只有主鍵,所以只掃索引就可以讀取。第一個句子還要查其他列,這樣涉及大量隨機讀寫。
不貼執行計劃,要麼是瞎j8答,要麼是瞎j8問
第一個查詢使用 idx1 這個索引,第二個優化器應該使用了主鍵索引,看執行計劃吧
推薦閱讀:
※R markdown 連接mysql數據
※一觸即發,2017年,資料庫世界的諸神之戰
※mysql注入篇
※phxsql如何編譯?