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