mysql、索引、查询剖析工具

什么是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

红黑树

逻辑约束: 不满足则采取平衡措施

  1. 节点是红色或黑色
  2. 根节点是黑色
  3. 每个红色节点的两个字节点都是黑色
  4. 新插入的节点默认是红色

平衡措施:

  1. 变色
  2. 自旋

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,不会用到,因为使用了不等于

猜你喜欢

转载自blog.csdn.net/dandanforgetlove/article/details/106307130