Mysql知识点

索引:分类、数据结构、回表、索引覆盖(不需要回表)、组合索引、最左匹配、索引下推

innodb

索引:分类 主键、唯一、普通、全文、组合

主键和唯一的区别:唯一可以有空值
普通索引:既不是主键列、又不是唯一索引列

组合索引:一个索引,包含多个列

聚簇索引:B+树,以主键或唯一索引或行号为节点值建立B+树,叶子节点为行数据;每张表只能有一个聚簇索引。
辅组索引:非聚簇索引,除了聚簇索引就是辅组索引;叶子节点存储的是主键值,通常需要二次查找。

聚簇索引和非聚簇索引

是什么?
作用:提高查询速度

为什么会慢?有io,io比较耗时
如何解决?提高io速度、减少io次数

回表
底层数据结构:B+树,B树(n叉树)
在当前B+树中不能查找到全部数据,则会在聚簇索引中查找,因此会产生回表。

B树:数据存储在节点
B+树:数据存储在叶子节点

索引覆盖

覆盖索引(covering index)指一个查询语句的执行只用从索引中就能够取得,不必从数据表中读取。也可以称之为实现了索引覆盖。 当一条查询语句符合覆盖索引条件时,MySQL只需要通过索引就可以返回查询所需要的数据,这样避免了查到索引后再返回表操作,减少I/O提高效率。

  1. 非聚簇索引不需要回表/读表

例如:
建立name字段的索引

select name from person where name=‘张三’

name字段已经在索引中,不需要再回表。这就叫索引覆盖。

组合索引与最左匹配

person表有id(主键)、name(varchar)、age(int)、addr(varchar)四个字段,name、age、addr建立组合索引,以下sql语句的执行效率有何不同:

select * from person where name=‘zhang’ and age>0 and addr=‘san’;
select * from person where name=‘zhang’ and age>0 ;
select * from person where age>0 and addr=‘san’;
select * from person where name=‘zhang’ and addr=‘san’;

学会使用EXPLAIN命令查看sql开销:

EXPLAIN select * from person where name=‘zhang’ and age>0 and addr=‘san’;
EXPLAIN select * from person where name=‘zhang’ and age>0 ;
EXPLAIN select * from person where age>0 and addr=‘san’;
EXPLAIN select * from person where name=‘zhang’ and addr=‘san’;

结果是第三条sql与其他几条不同。

EXPLAIN 命令详解

索引下推(index condition pushdown:ICP)

在5.6以前没有索引下推。非主键索引或二级索引检索到数据后,交由MYSQL服务器判断是否符合条件。
5.6及以后的版本,判断条件交由存储引擎执行,符合条件的返回MYSQL服务器。

Mysql性能优化:什么是索引下推?

MyISAM

也是B+树。
没有聚簇索引,数据存放在单独的数据文件中;主键索引和辅助索引一样,叶子节点都指向数据地址。

优化器

基于成本的优化

CBO

基于规则的优化

RBO

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值