一條MySQL的select語句,為什麼性能會差別這麼大?

用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如何編譯?

TAG:MySQL | 資料庫性能 |