MySQL系列文章
索引结构
首先要理解索引是什么,索引是一个特殊的数据结构简单理解成一本书的书签,当一张表建立索引时磁盘中也会存储一个独立的索引结构,通过建立的树状结构查询。这里为什么能加速查询也就显而易见了,树状查询比列表查询快很多。
索引存储在磁盘中的数据结构为B+树,本质上为一个多叉树,类似下图这样,仅有叶子节点存储数据。
索引逻辑结构类型
从逻辑结构上划分为聚簇索引与非聚簇索引。
聚簇索引
- 聚簇索引就是按照每张表的主键构造一颗B+树,同时叶子节点中存放的就是整张表的行记录数据。这个特性决定了索引组织表中数据也是索引的一部分,每张表只能拥有一个聚簇索引。
- 优点:数据访问更快,因为聚簇索引将索引和数据保存在同一个B+树中,因此从聚簇索引中获取数据比非聚簇索引更快,聚簇索引对于主键的排序查找和范围查找速度非常快
- 缺点:
- 插入速度严重依赖于插入顺序,按照主键的顺序插入是最快的方式,否则将会出现页分裂,严重影响性能。因此,对于InnoDB表,我们一般都会定义一个自增的ID列为主键
- 更新主键的代价很高,因为将会导致被更新的行移动。因此,对于InnoDB表,我们一般定义主键为不可更新。
- 二级索引(手动添加的索引)访问需要两次索引查找,第一次找到主键值,第二次根据主键值找到行数据。
非聚簇索引
- 在聚簇索引之上创建的索引称之为辅助索引,辅助索引访问数据总是需要二次查找。
- 辅助索引叶子节点存储的不再是行的物理位置,而是主键值。
- 通过辅助索引首先找到的是主键值,再通过主键值找到数据行的数据页,再通过数据页中的Page Directory找到数据行。
- innodb采用聚簇索引,mysima采用非聚簇索引
索引功能类型
而从功能上划分为主键索引、唯一索引、普通索引、全文索引
主键索引
- 主键索引是一种特殊的唯一索引,不允许值重复或者值为空。
唯一索引
- 唯一索引与普通索引类似,不同的是创建唯一性索引的目的不是为了提高访问速度,而是为了避免数据出现重复。
普通索引
- MySQL 中最基本的索引类型,它没有任何限制,唯一任务就是加快系统对数据的访问速度。
全文索引
- 用来查找文本中的关键字
索引下推
- 本质上为了减少回表次数从而减少io操作
- 根据条件在普通索引树搜索时,先在普通索引树结果执行where过滤条件再回表执行查询
覆盖索引
- 普通的索引查询步骤为,先根据索引树定位到主键,再根据主键去聚簇索引树回表查询数据行信息
- 本质上是索引中包含了要查询的字段信息,所以不用额外的进行回表查询
索引选错
- 优化器会根据扫描行数、是否使用临时表、是否排序、是否需要回表等因素进行综合判断。
- mysql执行语句时并不能准确知道满足条件的条数,只能统计估算
- InnoDB默认会选择N个数据页,统计这些页面上的不同值,得到一个平均值,然后乘以这个索引的页面数,就得到了这个索引的基数
- 数据会持续更新的,索引统计信息也会变。当变更的数据行数超过1/M的时候,会自动触发重新做一次索引统计。
- MySQL 会在选择索引的时候进行优化,如果 MySQL 认为全表扫描比走索引+回表效率高, 那么他会选择全表扫描,如果认为走索引的效率高,那么肯定也是会走索引的
- 如何解决?
- foces index强制按照指定索引查询
- 修改语句