MySQL技术内幕-InnoDB存储引擎读写笔记(索引概述)
日期: 2017-07-15 分类: 跨站数据测试 258次阅读
B+树索引的使用
1、什么情况下适合建索引
1)高选择性字段,比如姓名等重复性率比较少的,典型的一般性别等字段,这种字段就没必要建索引。
2)需要遍历的行数比较少。
2、顺序读、随机读、预读取
顺序读:指顺序的读取磁盘上的块(Block)
随机读:访问的块不是连续的,需要磁盘的磁头不断的移动。
在InnoDB存储引擎中,根据主键索引访问范围数据,其顺序只是逻辑有序,物理上并不一定是有序的,只是相对有序,因为一个区包括连续的64页。
3、联合索引
为什么联合索引必须包含第一列的查询条件呢?
因为索引天生是排序的,会先按照第一列排序,然后第二列排序,这样就保证了整个是一个优先序列。
但如果忽略第一列,整个序列就变的没有顺序,故无法使用索引。
例如 (1,1) (1,2) (2,1) (2,4) (3,1) (3,2) 如果不使用第一列,第二列值 1,2,1,4,1,2没有顺序可言,就只能全表扫描
了。
4、索引选择
mysql数据库的优化器会通过explain的rows字段预估查询可能得到的行,如果大于某一个值,则B+树会选择全表的扫描。至于这个值,根据大神的经验,一般是20%,即当取出的数据量超过表中的20%,优化器就不会使用索引,而是全表扫描。为什么会这样呢?
InnoDB的逻辑存储结构与Oracle类似,使用表空间用来存储数据,而且建议每个表使用单独的表空间文件。B+树叶子节点存放数据,每页都有前后两个指针,所以说数据逻辑上是有序的,但在物理上并不是完全有序的,部分有序(因为表空间由段组成,每个段有多个区组成,每个区有连续的页组成,段下的各个区并不是有序的。所有如果通过索引要扫描很多数据,随机IO相对较多,性能低下。而是用全表扫描,采用的是顺序IO读取,虽然数据读取量多,但读取速度快,并不比是用索引花销大。
欢迎加笔者微信号(dingwpmz),加群探讨,笔者优质专栏目录:
精华推荐