联合索引

1.联合索引与最左前缀原则

ALTER TABLE 可以用来创建索引,包括普通索引、UNIQUE索引或PRIMARY KEY索引:

ALTER TABLE table_name ADD INDEX index_name (column_list)

ALTER TABLE table_name ADD UNIQUE (column_list)

ALTER TABLE table_name ADD PRIMARY KEY (column_list)

ALTER TABLE user_innodb add INDEX comidx_name_phone(name,phone); -- 创建联合索引

2. 联合索引是怎么组织的

联合索引

相比于单值索引:

联合索引在 B+Tree 中是复合的数据结构

由于 B+树本身是有序的,所以联合索引是从左到右的顺序来建立搜索树的(name在左边,phone在右边)。从上图可以看出来,name是有序的,phone是无序的。当name相等的时候,phone才是有序的。

当存储引擎是InnoDB时,叶节点存储的是数据/主键

3.联合索引是怎么查找数据的

比如,我们使用 where name=‘Bob’ and phone = ‘132xx’ 去查询数据的时候

B+Tree 会优先比较 name 来确定下一步应该搜索的方向,往左还是往右

如果 name相同的时候再比较 phone

但是如果查询条件没有name,就不知道第一步应该查哪个节点,因为建立搜索树的时候name是第一个比较因子,所以用不到索引

4.联合索引与单值索引什么关系

假设我们的项目里面有两个查询很慢:

SELECT * FROM user_innodb WHERE name= ?;

SELECT * FROM user_innodb WHERE name= ? AND phone=?;

按照我们的想法,一个查询创建一个索引,所以我们针对这两条SQL创建了两个索引,这种做法觉得正确吗?

CREATE INDEX idx_name on user_innodb(name);

CREATE INDEX idx_name_phone on user_innodb(name,phone);

当我们创建一个联合索引的时候,用左边的字段name去查询的时候,也能用到索引,所以单独为name创建一个索引完全没必要。相当于建立了两个联合索引(name)、(name,phone)。

如果我们创建三个字段的索引index(a,b,c),相当于创建三个索引:index(a)、index(a,b)、index(a,b,c)。用 where b=? 和 where b=? and c=? 和where a=? and c=?是不能使用到索引的。因为不能不用第一个字段,不能中断。

5.最左前缀原则

 因为联合索引中包含了多个字段,所以不能像单值索引那样直接使用就行。那需要遵守什么规则呢?

答:最左前缀原则:带头大哥不能死,中间兄弟不能断。

https://blog.csdn.net/weixin_43935927/article/details/109491334

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容