Mysql回表与索引覆盖,联合索引问题

一、Mysql为什么可以存储海量数据?

1.使用B+引擎,可以减少IO请求,使用的B+树,为N叉树,与普通的二叉树比较起来,高度跟低
2.查询效率稳定,每次都从根节点到叶子节点,叶子节点只存储数据
3.叶子节点为双向循环链表,且按照关键字大小进行排列,可以有效的进行范围查询,hash索引在等值查询上效率高。

二、InnoDB与聚簇索引

聚簇索引:数据与索引存放在一起,找到了索引就找到了数据
InnoDB:底层由B+树实现,每个节点对应innodb的一个page,page的大小固定为16K,同一页可以有多条数据,也就是说访问数据时候,已经把页page加载到buffer中,直接在内存中查询,不必再访问磁盘。
优点:
1.使用经常更新的表,适合崇礼并发更新请求
2.支持事务
3.有binlog容灾日志
4.支持外键约束
5.支持行级锁

三、Myisam与非聚簇索引

非聚簇索引:索引与数据不存放在一起,需要先将索引缓存到内存中去在找数据
myisam:mysql的默认存储引擎,读操作效率高,写效率低。
优缺点:
1.不支持事务,外键
2.只有表级锁
3.写效率低下

四、回表与索引覆盖

辅助索引,主键索引B+
回表:访问两次索引才能查询到数据【效率低下】
索引覆盖:表中的全部字段都是索引列的时候,会产生索引覆盖;解决回表问题,using index 【效率高】

例如:

select id, name from table where name = 'xxxx';

会先根据name的值,在name B+树上查找叶子节点
再去根据id获取id B+树上的所有数据

五、联合索引

1.当表中的全部字段都是索引列的时候,会产生索引覆盖。
2.通过索引就可以返回查询所需要的数据,这样避免了查到索引后再返回表操作,减少I/O提高效率。
3.此时,最左侧匹配原则可能会失败
在这里插入图片描述
在这里插入图片描述
覆盖索引失败原因:
1.select选择的字段中含有不在索引中的字段 ,即索引没有覆盖全部的列。
2.where条件中不能含有对索引进行like的操作。

猜你喜欢

转载自blog.csdn.net/wyn_365/article/details/121883140