mysql 最左_mysql最左原则

4aa6dbbfbc28f1348b0bc0b70753c002.png

概述

最左原则就是建一个联合索引,比如(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 seata.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‘;

执行结果

bce4d663eb9dc044b3d2f01ec6488d65.png

上面执行的时候,按建的索引顺序进行查询,其中用到了联合索引,平常写sql的时候要习惯用explain执行下,看下执行计划。

decf130647cf19a6fa65d7605f668b47.png

单独使用索引的最左列查询,联合索引生效

1ad4079923a62ce31587bb5dd4bec03c.png

索引中的列调换顺序,联合索引生效,说明跟顺序无关,只要包含索引最左列。

be9eeb8da06856a02e7bfe3d2e177536.png

索引中的列,在条件查询中只使用后面的一列,索引失效,说明必须得包含索引最左列。

add46d794450d83f08be7782036b2ea3.png

索引中的列,在查询条件多用到了,但是查询条件的类型跟设置的类型不一致,索引失效,说明索引跟数据类型也有关。

原理

索引的底层是一颗B+树,联合索引的健值数量不是一个,而是多个。构建一颗B+树只能根据一个值来构建,因此数据库依据联合索引最左的字段来构建B+树。

例子:假如创建一个(a,b)的联合索引,那么它的索引树是这样的

8e4d6c4520eea573bc2454793f6be764.png

可以看到a的值是有顺序的,1,1,2,2,3,3,而b的值是没有顺序的1,2,1,4,1,2。所以b = 2这种查询条件没有办法利用索引,因为联合索引首先是按a排序的,b是无序的。

面临的问题

1、创建索引是要占用物理空间

2、索引的增加会影响数据的更新和删除速度

3、创建索引和维护索引要耗费时间,时间随着数据量的增加而增加

总结

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

原文:https://blog.51cto.com/xxdeelon/2538308

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值