概述
最左原则就是建一个联合索引,比如(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';
执行结果
上面执行的时候,按建的索引顺序进行查询,其中用到了联合索引,平常写sql的时候要习惯用explain执行下,看下执行计划。
单独使用索引的最左列查询,联合索引生效
索引中的列调换顺序,联合索引生效,说明跟顺序无关,只要包含索引最左列。
索引中的列,在条件查询中只使用后面的一列,索引失效,说明必须得包含索引最左列。
索引中的列,在查询条件多用到了,但是查询条件的类型跟设置的类型不一致,索引失效,说明索引跟数据类型也有关。
原理
索引的底层是一颗B+树,联合索引的健值数量不是一个,而是多个。构建一颗B+树只能根据一个值来构建,因此数据库依据联合索引最左的字段来构建B+树。
例子:假如创建一个(a,b)的联合索引,那么它的索引树是这样的
可以看到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