Mysql45讲心得|Mysql45讲------索引

1三种索引模型
1)hash
优点:对等值索引速度很快,
确定:去见索引还是要全部遍历,并且要解决hash碰撞
2)有序数组
优点:等值索引和区间索引都很快
缺点:有序数组索引只适用于静态存储引擎,比如你要保存的是2017年某个城市的所有人口信息,这类不会再修改的数据。
3)B树&&B+树
树其实是为了解决上面2种模型的缺点
问:为什么是B树而不是平衡树呢
答:平衡树的缺点就是高度太高了,会进行多次磁盘IO
M阶B树的特点(阶数指的是子节点的最多个个数)
1.根如果不是叶结点,则至少有两个子女。
2.每个中间节点最多包含M-1个元素,M个子树
3.除了,根节点和叶子节点,其他节点至少有ceil(M/2)个子树
4.所有的叶子结点都位于同一层。
5.每个节点中的元素从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域分划。
具体数据结构可以参考如下图片
Mysql45讲心得|Mysql45讲------索引
文章图片

B+树的特点
1.所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
2.所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素。
3 最多含有M个关键字和 M课子树
问:那为什么是B+树而不是B树呢,
答:1 因为它内节点不存储data,这样一个节点就可以存储更多的key。
2范围索引效率更高
3支持组合索引
MYISAM引擎
MYISAM引擎创建会创建3个File
.frm 表结构,myd 数据文件,myi 索引文件
myi索引文件的的叶子节点都是直接myd数据行的指针,MYISAM的辅助索引也是指向myd文件的指针
INNODB引擎
INNODB引擎会创建2个file
.frm 表结构,ibd数据文件
INNODB的索引文件,叶子节点就是数据行本身,而辅助索引的叶子节点是聚集索引的键,所以要进行回表操作。
和MYISAM比较起来的话,INNODB效率更高,因为它把数据缓存下来了。
由于,辅助索引的叶子节点也会保存聚集索引,所以聚集索引应该尽量使用小数据
覆盖索引
由于辅助索引的叶子节点保存的都是,聚集索引。索引当我们根据辅助索引的查询聚集索引的时候可以建立一个覆盖索引 index(id,k); 这样就可以避免回表
【Mysql45讲心得|Mysql45讲------索引】最左匹配原则
在创建多列索引时,要根据业务需求,where子句中使用最频繁的一列放在最左边。比如,当已经有了(a,b)这个联合索引后,一般就不需要单独在a上建立索引
例如
aMysql45讲心得|Mysql45讲------索引
文章图片

这样就相当于建立了2个索引 (name) (name,age)
索引下推
当使用索引条件下推优化时,如果存在某些被索引的列的判断条件时,MySQL服务器将这一部分判断条件传递给存储引擎,然后由存储引擎通过判断索引是否符合MySQL服务器传递的条件,只有当索引符合条件时才会将数据检索出来返回给MySQL服务器。索引条件下推优化可以减少存储引擎查询基础表的次数
索引失效
1单独引用复合索引里非第一位置的索引列
2like 以%开始
3对索引应用内部函数
4对索引列运算,运算包括(+、-、*、/、!、<>、%、like’%_’(%放在前面)、or、in、exist等),导致索引失效。
5类型错误
6隐式转换 当字段类型是字符串但传入的是索引是INT 不走索引,放过来走
不推荐使用索引
1 mysql复合索引还不支持不同类型的排序操作,即使建立索引时定义不同的排序也是无效的
2 索引经常更改
3 索引字段过长
唯一索引和普通索引
区别 唯一索引查询到第一个就会停止,但是普通索引还会往后走
前缀索引
alter table SUser add index index2(email(6));
建前缀索引,节省空间,但会增加查询扫描次数,并且不能使用覆盖索引
explain
select_type:表示查询的类型。
table:输出结果集的表
partitions:匹配的分区
type:表示表的连接类型
possible_keys:表示查询时,可能使用的索引
key:表示实际使用的索引
key_len:索引字段的长度
ref:列与索引的比较
rows:扫描出的行数(估算的行数)
filtered:按表条件过滤的行百分比
Extra:执行情况的描述和说明
四、type
对表访问方式,表示MySQL在表中找到所需行的方式,又称“访问类型”。
常用的类型有: ALL、index、range、 ref、eq_ref、const、system、NULL(从左到右,性能从差到好)
ALL:Full Table Scan, MySQL将遍历全表以找到匹配的行
index: Full Index Scan,index与ALL区别为index类型只遍历索引树
range:只检索给定范围的行,使用一个索引来选择行
ref: 表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值
eq_ref: 类似ref,区别就在使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配,简单来说,就是多表连接中使用primary key或者 unique key作为关联条件
const、system: 当MySQL对查询某部分进行优化,并转换为一个常量时,使用这些类型访问。如将主键置于where列表中,MySQL就能将该查询转换为一个常量,system是const类型的特例,当查询的表只有一行的情况下,使用system
NULL: MySQL在优化过程中分解语句,执行时甚至不用访问表或索引,例如从一个索引列里选取最小值可以通过单独索引查找完成。
五、possible_keys
指出MySQL能使用哪个索引在表中找到记录,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用(该查询可以利用的索引,如果没有任何索引显示 null)
该列完全独立于EXPLAIN输出所示的表的次序。这意味着在possible_keys中的某些键实际上不能按生成的表次序使用。
如果该列是NULL,则没有相关的索引。在这种情况下,可以通过检查WHERE子句看是否它引用某些列或适合索引的列来提高你的查询性能。如果是这样,创造一个适当的索引并且再次用EXPLAIN检查查询
六、Key
key列显示MySQL实际决定使用的键(索引),必然包含在possible_keys中
如果没有选择索引,键是NULL。要想强制MySQL使用或忽视possible_keys列中的索引,在查询中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。
七、key_len
表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度(key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的)
不损失精确性的情况下,长度越短越好
八、ref
列与索引的比较,表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值
九、rows
估算出结果集行数,表示MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数
十、Extra
该列包含MySQL解决查询的详细信息,有以下几种情况:
Using where:不用读取表中所有信息,仅通过索引就可以获取所需数据,这发生在对表的全部的请求列都是同一个索引的部分的时候,表示mysql服务器将在存储引擎检索行后再进行过滤
Using temporary:表示MySQL需要使用临时表来存储结果集,常见于排序和分组查询,常见 group by ; order by
Using filesort:当Query中包含 order by 操作,而且无法利用索引完成的排序操作称为“文件排序”
– 测试Extra的filesort
explain select * from emp order by name;
Using join buffer:改值强调了在获取连接条件时没有使用索引,并且需要连接缓冲区来存储中间结果。如果出现了这个值,那应该注意,根据查询的具体情况可能需要添加索引来改进能。
Impossible where:这个值强调了where语句会导致没有符合条件的行(通过收集统计信息不可能存在结果)。
Select tables optimized away:这个值意味着仅通过使用索引,优化器可能仅从聚合函数结果中返回一行
No tables used:Query语句中使用from dual 或不含任何from子句
– explain select now() from dual;

    推荐阅读