1.前言
这次小编预备用两篇文章来和大家分享下mysql innodb的索引: mysql的基础常识 和 基于索引的sql优化 。
2. 什么是索引?
定义:索引是数据库中用于极速查找数据的机制,实质是某种数据结构。它存储着指向数据的指针,从而协助数据库跳过不用要的行,间接定位到指标数据,增加扫描期间。
比如咱们看<<三国演义>>刘备三顾茅庐这章,假设没有目录,咱们就须要一篇一篇的翻书,要翻很久,由于不知道在书的哪一页;但是假设有目录,咱们是不是先在目录外面找到这章的目录,这章的目录对应着注释的书页,咱们一下就可以翻到对应的书页,找到对应的章节。目录就相似于mysql的索引。
3. 为什么须要索引?
WHERE 子句中的条件过滤。
ORDER BY 语句启动排序时。
GROUP BY 语句启动分组时。
多表 JOIN 操作时婚配外键或其余关系列。
4. 索引的类型
5. 索引的结构
这里强调一下:innodb只能创立B-Tree 索引,不允许哈希索引。即使创立的时刻选用的是哈希,实践创立之后的结果也是B-Tree,有兴味的同窗可以试试,小编这里就不截图了。
上方,小编用六条数据模拟下索引的结构。首先看下表结构:
而后表外面的数据:
而后看下主键索引的结构,这里是小编依据索引的结构自己画的:
依据这个B+ 树索引结构图,小编便捷的说下:
二级索引
除了主键外,咱们会依据查问的字段,也去建设相应的字段索引。小编这里就不画图了,二级索引的叶子节点放的是对应的主键索引值。
回表
指的是 MySQL 在经过二级索引查找到合乎条件的记载后,还须要回到主键索引中去读取额外的列数据。由于索引只蕴含局部列的消息,假设查问中恳求了索引中未蕴含的列,数据库就须要从主键索引中再次读取完整的行数据。
比如user表中,我给name参与索引,我须要查问name=小九这行数据的消息,由于二级索引是没有完整的数据,所以mysql须要去主键索引外面找到对应的完整数据前往。
笼罩索引
指的是当一个索引齐全蕴含了查问所需的一切列时,MySQL 不须要再回表,而是间接从索引中就可以前往结果。这种状况就称为笼罩索引。
比如user表中,我给name参与索引,我须要查问name=小九这条数据的id,由于id在叶子节点曾经有了,间接就前往了却果,不须要去主键索引再次查问。
笼罩索引的长处:
功能优化:防止了回表,降落了 I/O 和查问期间。增加表扫描:索引的存储比表的数据量小得多,索引扫描比全表扫描快。