mysql最左原则_第1张图片

概述

最左原则就是建一个联合索引,比如(a,b,c),然后根据条件查询,条件的组合必须是包含a,否则联合索引不会用到,可能的组合是:(a,b,c),(a,b),(a,c),(a).

重要性

最左原则能引导程序员们使用联合索引的时候,不是盲目的使用,如果不知道这个原则的话,就会在写sql的时候虽然建了索引,并且条件查询也用了,查询的时候还是慢,结果用explain一看,索引没有用到,扫描是全表扫描。

示例

创建表

CREATE TABLE order (
id int(11) NOT NULL AUTO_INCREMENT,
user_id varchar(255) DEFAULT NULL,
order_no varchar(255) DEFAULT NULL,
commodity_code varchar(255) DEFAULT NULL,
count int(11) DEFAULT '0',
money int(11) DEFAULT '0',
PRIMARY KEY (id),
KEY idx_uid_order_no (user_id,order_no)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

编码sql

INSERT INTO order (id, user_id, order_no, commodity_code, count, money) VALUES ('1', '1', '1234567', '11', '1', '1');
2.2、explain SELECT user_id,order_no,money FROM order WHERE user_id = '1' AND order_no = '1234567';

执行结果

mysql最左原则
上面执行的时候,按建的索引顺序进行查询,其中用到了联合索引,平常写sql的时候要习惯用explain执行下,看下执行计划。
mysql最左原则_第2张图片
单独使用索引的最左列查询,联合索引生效
mysql最左原则_第3张图片
索引中的列调换顺序,联合索引生效,说明跟顺序无关,只要包含索引最左列。
mysql最左原则_第4张图片
索引中的列,在条件查询中只使用后面的一列,索引失效,说明必须得包含索引最左列。
mysql最左原则_第5张图片
索引中的列,在查询条件多用到了,但是查询条件的类型跟设置的类型不一致,索引失效,说明索引跟数据类型也有关。

原理

索引的底层是一颗B+树,联合索引的健值数量不是一个,而是多个。构建一颗B+树只能根据一个值来构建,因此数据库依据联合索引最左的字段来构建B+树。
例子:假如创建一个(a,b)的联合索引,那么它的索引树是这样的

mysql最左原则_第6张图片
可以看到a的值是有顺序的,1,1,2,2,3,3,而b的值是没有顺序的1,2,1,4,1,2。所以b = 2这种查询条件没有办法利用索引,因为联合索引首先是按a排序的,b是无序的。

面临的问题

1、 创建索引是要占用物理空间
2.、 索引的增加会影响数据的更新和删除速度
3、 创建索引和维护索引要耗费时间,时间随着数据量的增加而增加

总结

1、 项目为了提高效率,创建联合索引,并知道其最左原则,可以节省很多开发时间。
2、 创建索引要根据具体情况进行评估,做出合理的决定,
3、 另外单表最好索引不要超过5个,组合索引不要超过5个列,索引的命名要规范,比如:idx_列名1_列名2,列 名比较长,请使用简写,比如:user_id可以简写uid。

参考来源:https://www.cnblogs.com/lanqi/p/10282279.html