常見type級別
system > const > eq_ref > ref > range > index > ALL
越往左邊,性能越高,比如system就比ALL類型性能要高出許多,其中system、const只是理想類型,基本達不到;我們自己實際能優化到ref>range這兩個類型,就是你自己寫SQL,如果你沒優化基本上就是ALL,如果你優化了,那就盡量達到ref>range這兩個級別。
當sex字段為char類型
首先咱們先建表
CREATE DATABASE student;
CREATE TABLE stu(
`id` INT PRIMARY KEY,
`sex` CHAR,
KEY `idx_sex` (`sex`) USING BTREE
)ENGINE=INNODB DEFAULT CHARSET=utf8;
insert into stu valuse(1,'0'),(2,'0'),(3,'1');
咱們給sex字段加了B樹索引
char類型 加單引號與不加區別
EXPLAIN SELECT * FROM stu WHERE sex=1;
可以查看到,type為index,查詢行數3條,即將所有記錄都查詢了一遍
所以不會走索引!!!!
EXPLAIN SELECT * FROM stu WHERE sex='1';
加了單引號,走了索引,type為ref級別,查詢行數1條。
所以會走索引
當sex字段為int類型
首先咱們先建表
CREATE DATABASE student;
CREATE TABLE stu(
`id` INT PRIMARY KEY,
`sex` INT,
KEY `idx_sex` (`sex`) USING BTREE
)ENGINE=INNODB DEFAULT CHARSET=utf8;
insert into stu valuse(1,'0'),(2,'0'),(3,'1');
int類型 加單引號與不加區別
EXPLAIN SELECT * FROM stu WHERE sex=1;
EXPLAIN SELECT * FROM stu WHERE sex='1';
兩條語句執行結果可知,數據類型為int類型,不管加不加單引號,都會走索引,type級別都為ref
總結
- 當查詢的類型與字段類型不一致時,不會走索引。
- int類型無論加沒有加引號都會走索引。
- 為了避免不走索引,最好還是使得查詢的類型與字段類型一致。
TIP
2020年9月25日 面試項目經理告訴我,sex=1,在幾百萬條數據情況下,不走索引,系統會認為不走索引速度更快一些,所以選擇不走索引。