什么是mysql索引
mysql索引是帮助mysql高校获取数据的数据结构,实现了高级查找算法的数据结构,索引一般以文件形式存储在磁盘上。
回表
索引列 name。 select * from table where name = 'ma'; 通过name索引找到ma元素对应的主键为 1,但是select * ,所以需要回到table查询所有字段。即为回表
覆盖索引
select id from table where name = 'ma'; 查询到ma 主键为id,只select了id,所以可以直接返回。即为覆盖索引。
最左匹配
联合索引 name、age
查询:select * from table where age = 3; 由于是联合索引,但是只查询了age,不走索引! 除非 where name='zhang' and age=3 或者 age =3 and name = 'zhang' 或者 name = 'zhang' 。必须匹配到最左的索引字段
谓词下推
select * from table where name = a and age = 6;
谓词未下推前,先从磁盘中找出 name = a的数据,service层再找出age =6的数。谓词下推,再磁盘中搜索name=a的同时排除掉age不等于6的。前提 name和age是组合索引
mysql 查询剖析工具
新版本使用 performance_schema
show profiles; 显示所有的sql语句。
show profile for query query_id; 对指定query_id sql 进行剖析。
B+ Tree
EXPLAIN 分析语句
EXPLAIN select * from product_sale_rank where sales_total > 20
详解: https://blog.csdn.net/why15732625998/article/details/80388236
红黑树
逻辑约束: 不满足则采取平衡措施
- 节点是红色或黑色
- 根节点是黑色
- 每个红色节点的两个字节点都是黑色
- 新插入的节点默认是红色
平衡措施:
- 变色
- 自旋
B-Tree 和B+Tree
B-Tree
节点会存储数据,节点之间不会有链指针。 因为节点存储数据,所以节点高度仍旧很高,可存储的索引变少。
B+Tree
非叶子节点不存储数据,叶子节点之间都有一个链指针
聚簇索引和非聚簇索引的区别?
聚簇索引节点会存放数据,非聚簇索引不会。
为什么非主键索引结构叶子节点存储的是主键值而不是数据?
1.为了减少存储空间
2.数据一致性。只存储主键值,假如修改数据,不会被影响。
Innodb怎么保证必有主键?
有主键则作为主键索引,没有指定的时候,会查找唯一索引。如果没有唯一索引,innodb会默认创建一个主键。
为什么推荐整型自增的作为主键?
1.存储空间
2.增加索引速度
联合索引
最左匹配。
eg: 联合索引 A+ B+ C, select * from table where b = 1 and c = 1. 不走索引,最左匹配原则,没有匹配到A
select * from table where b = 1 and c = 1 and a = 1.会使用索引,因为有用到a
select * from table where a!= 1,不会用到,因为使用了不等于