今天面试的时候,面试官有问到这个问题我说不会,可是面试官说走,网上也众说纷纭,那到底会不会走呢?
先看官网解释不会走:
https://dev.mysql.com/doc/refman/8.0/en/multiple-column-indexes.html
SELECT * FROM tbl_name WHERE col1=val1;
SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2;
SELECT * FROM tbl_name WHERE col2=val2;
SELECT * FROM tbl_name WHERE col2=val2 AND col3=val3;
If an index exists on (col1, col2, col3), only the first two queries use the index. The third and fourth queries do involve indexed columns, but do not use an index to perform lookups because (col2) and (col2, col3) are not leftmost prefixes of (col1, col2, col3).
实验以下:
MYSQL 版本 8.0.28
CREATE TABLE `abcd` (
`a` varchar(255) DEFAULT NULL,
`b` varchar(255) DEFAULT NULL,
`c` varchar(255) DEFAULT NULL,
`d` varchar(255) DEFAULT NULL,
KEY `abc` (`a`,`b`,`c`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
explain select b,c,d from abcd;
没有走
explain select c,b from abcd;
咦,怎么又走索引了哈哈哈,果然还是要实践出真知;
原因:
第一种不走是因为走了索引也需要回表,对性能优化没太大用处,当然,你可以把索引改为(a,b,c,d ),然后又可以命中了。
第二种走是因为主要是因为查询的所有字段在索引中都可以找到,根本就不需要回表,直接覆盖索引了
结论:
abc 联合索引查 bc索引到底走不走索引,主要还是要看select语句有没有索引没有覆盖的字段,如果有全表扫描,没有的话就走索引