内容简介:基于非主键索引的查询,需要额外扫面主键索引,这个过程叫做回表直接返回索引上的字段,无需回表查询减少读磁盘,
-
哈希表
- 只适用于等值查询场景
-
有序数组
- 等职查询,范围查询性能优秀
-
搜索树
- N叉树读写性能优秀, 适配磁盘访问模式 ,减少单次查询磁盘的次数
InnoDB索引模型
- 表的数据是根据主键顺序以索引的形式存放(索引组织表)
- 使用B+树索引模型,一个索引就是一棵B+树
-
索引类型
-
主键索引(聚簇索引)
- 主键索引的叶子节点存放的是整行数据
-
非主键索引
- 非主键索引的叶子节点内容就是主键的值
-
主键索引(聚簇索引)
基于非主键索引的查询,需要额外扫面主键索引,这个过程叫做回表
覆盖索引
- 一个索引覆盖了查询语句需要的所有字段
- 可以减少树的搜索次数,是一个常用的性能优化手段
直接返回索引上的字段,无需回表查询
索引下推
- MySQL5.6引入索引下推优化
- 再索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表的次数
change buffer
减少读磁盘, 仅适用于普通索引
- InnoDB的数据是按数据页为单位来读写,数据页大小默认为 16KB
当需要都一条记录的时候,并不是将这条记录从磁盘中读出,而是以页为单位,整页数据读入内存
- 当需要更新一个数据页的时候,如果 数据页在内存中就直接更新 ;而如果数据页不在内存中,InnoDB会在不影响数据一致性的前提下,将 更新操作缓存进change buffer中 ,下次访问数据页的时候,将数据页读入内存中,再执行change buffer中跟这页有关的操作(避免占用内存,提高内存利用率,内存命中率)
-
将change buffer中的操作应用到原数据页,得到最新的结果的过程称为merge
- 访问数据页会触发merge
- 系统有后台线程定期merge
- 数据库正常关闭的过程,也会执行merge操作
-
唯一索引无法使用change buffer
- 对于唯一索引,所有更新操作都需要判断是否违反唯一约束,所以在插入一条记录的时候,要判断记录是否已存在,此时必须将数据页读入内存,所以无需再使用change buffer
- change buffer是可以持久化的,可以被写到磁盘中
- change buffer 适合写多读少的业务 (写完以后,马上被访问的概率比较小),例如:账单类,日志类的系统
如果业务场景是写完以后马上读,这样随机读次数不会减少,反而要增加change buffer的维护代价(起了副作用)
change buffer和redo log对比
- redo log 主要节省的是随机写磁盘的IO消耗
- change buffer 主要节省的是随机读磁盘的IO
索引选择
- 选择索引是优化器的工作,优化器选择最优的执行方案(成本最低)去执行语句
扫描行数是影响执行成本的因素之一,此外还有是否使用临时表,是否 排序 等因素
判断扫描行数
- 判断扫描行数是根据统计信息来估算的
- 统计信息是指索引的区分度,一个索引上不同的值越多,区分度越高
-
一个索引上不同的值的个数称为“基数”
-
通过
show index from table_name
可以查看索引的信息
-
通过
索引的基数统计方式 - 采样统计
analyze table
索引统计信息的存储方式
-
通过设置参数innodb_stats_presistent的值来选择
- (默认)设置为on:表示统计信息会持久化存储,此时N = 20, M = 10(默认值)
- 设置为off:表示统计信息只会存储在内存中,此时N=8,M=16(默认值)
- explain 执行计划中的rows字段表示预估扫描行数
优化器错误选择索引的处理方式
- 使用force index(不推荐)
- 修改SQL,诱导优化器使用期望的索引(推荐)
- 新建合适索引,删除误用的索引(特定场景下适用)
MySQL教程推荐
- 极客时间 - 《MySQL实战45讲》
- 《高性能 MySQL 第三版》
以上所述就是小编给大家介绍的《MySQL学习笔记 - 2 - 索引相关》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- MySQL 笔记 - 索引类型
- Mongodb 学习笔记(二) :索引
- Mysql B+树索引 笔记
- Sphinx源码学习笔记(一):索引创建
- elasticsearch学习笔记(三十五)——Elasticsearch 索引管理
- elasticsearch学习笔记(三十一)——Elasticsearch doc value正排索引
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Visual LISP程序设计
李学志 / 清华大学 / 2006-5 / 29.00元
本书系统地介绍了AutoCAD最新版本(2006)的Visual LISP程序设计技术。全书共分13章。前3章介绍AutoLISP语言的基础知识,第4章介绍Visual LISP的开发环境,第5~7章介绍程序的编辑、调试和设计的方法与技巧,第8章介绍如何定义新的AutoCAD命令及创建图层、线型、文字样式、剖面线、尺寸标注等各种AutoCAD对象,以及如何实现参数化图形设计的方法和技术,第9章介绍......一起来看看 《Visual LISP程序设计》 这本书的介绍吧!