MYSQL最左前缀原则

建立联合索引后,数据库会生成一颗B+树,值是主键。

回表:从联合索引表中查询到数据后,在回到主键表查询,避免数据冗余。

CREATE TABLE `t1` (
  `id` int NOT NULL,
  `a` int DEFAULT NULL,
  `b` int DEFAULT NULL,
  `c` int DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `index_bc` (`b`,`c`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

先任意插入12条数据

第一种情况

上图中查询表所有字段时,条件c遵循最左前缀原则。在b+中查询类似 *c,所以不使用索引查询,使用全表扫描。

 

 上图中,查询指定字段,并且遵循了最左原则,系统会自动优化。

 范围查询时,当查询的行数一旦过多,回表数量一旦增多,则不会使用索引。(系统内部自行判断回表成本和全文扫描查询成本)

  索引列不应该作为表达式的一部分,一旦对列改变后,就不能使用索引查询,对磁盘中的数据进行,会增大开销。

order by 中索引

 查找字段覆盖索引字段

 查找字段没有覆盖索引字段

一般情况下:where子句对于order 而言起到的是辅助作用

一般FileSort方式的查询情况:

1、检查的行数过多,且没有使用覆盖索引

2、使用了不同的索引,MySQL每回只采用一个索引

3、对索引列同时使用了ASC和DESC

4、where语句与order by语句,使用了不同的索引

需要先把a也设为索引

5、where语句或者ORDER BY语句中索引列使用了表达式

6、where 语句与ORDER BY语句组合满足最左前缀,但where语句中使用了条件查询

7、order by子句中加入了非索引列,且非索引列不在where子句中

8、order by或者它与where组合没有满足索引最左前列

9、当使用left join,使用右边的表字段排序

原文地址:https://www.cnblogs.com/yewook/p/14486694.html