索引是什么
MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。所以,索引的本质是数据结构。
你也可以理解为:排好序的快速查找数据结构。
在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,
这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。下图就是一种可能的索引方式示例:
左边是数据表,一共有两列七条记录,最左边的是数据记录的物理地址
为了加快Col2的查找,可以维护一个右边所示的二叉查找树,每个节点分别包含索引键值和一个指向对应数据记录物理地址的指针,这样就可以运用二叉查找在一定的复杂度内获取到相应数据,从而快速的检索出符合条件的记录。
数据本身之外,数据库还维护着一个满足特定查找算法的数据结构,这些数据结构以某种方式指向数据,这样可以在这些数据结构的基础上实现高级查找算法,这种数据结构就是索引。
一般来说,索引本身也很大,不可能全部储存在内存中,因此,索引往往以文件的形式储存在磁盘上,我们常说的索引,如果没有特别指明,都是指B树(多路索引树并不一定指二叉的)结构组织的索引
索引的结构(实现原理)
MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,B+Tree索引,哈希索引,全文索引等等
哈希索引:
只有memory(内存)存储引擎支持哈希索引,哈希索引用索引列的值计算该值的hashCode,然后在hashCode相应的位置存执该值所在行数据的物理位置,因为使用散列算法,因此访问速度非常快,但是一个值只能对应一个hashCode,而且是散列的分布方式,因此哈希索引不支持范围查找和排序的功能。
BTree索引:
跳转到 此博主:https://blog.youkuaiyun.com/u013967628/article/details/84305511
B+Tree索引:
跳转到 此博主https://blog.youkuaiyun.com/b_x_p/article/details/86434387
全文索引:
跳转到 此博主https://blog.youkuaiyun.com/mrzhouxiaofei/article/details/79940958
索引的分类:
单值索引:一个索引只包含单个列,一个表可以有多个单值索引
ALTER TABLE ‘table_name’ ADD INDEX index_name(‘col’);
唯一索引:索引列的值必须唯一,但允许有空值。
ALTER TABLE ‘table_name’ ADD UNIQUE index_name(‘col’);
复合索引: 一个索引包含多个列,多个列中不允许有空值
ALTER TABLE ‘table_name’ ADD INDEX index_name(‘col1’,‘col2’,‘col3’);
Explain
id:select查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序
select_type:
-
SIMPLE:简单的select查询语句,查询中不包括子查询或者UNION
-
PARMARY:查询中若包含任何复杂的子部分,最外层查询则被标记为
-
SUBQUERY:在SELECT或WHERE列表中包含了子查询
-
DERIVED:在FROM列表中包含的子查询被标记为DERIVED(衍生) ,MySQL会递归执行这些子查询, 把结果放在临时表里。
-
UNION:若第二个SELECT出现在UNION之后,则被标记为UNION;若UNION包含在FROM子句的子查询中,外层SELECT将被标记为:DERIVED
-
UNION RESULT:从UNION表获取结果的SELECT
table:显示这一行的数据是关于哪张表的
type:
- system:表只有一行记录(等于系统表),这是const类型的特列,平时不会出现,这个也可以忽略不计
- const:表示通过索引一次就找到了,const用于比较primary key或者unique索引。因为只匹配一行数据,所以很快
如将主键置于where列表中,MySQL就能将该查询转换为一个常量 - eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描
- ref:非唯一性索引扫描,返回匹配某个单独值的所有行.本质上也是一种索引访问,它返回所有匹配某个单独值的行,然而,它可能会找到多个符合条件的行,所以他应该属于查找和扫描的混合体
- range:只检索给定范围的行,使用一个索引来选择行。key 列显示使用了哪个索引一般就是在你的where语句中出现了between、<、>、in等的查询这种范围扫描索引扫描比全表扫描要好,因为它只需要开始于索引的某一点,而结束语另一点,不用扫描全部索引。
- index:Full Index Scan,index与ALL区别为index类型只遍历索引树。这通常比ALL快,因为索引文件通常比数据文件小。
(也就是说虽然all和Index都是读全表,但index是从索引中读取的,而all是从硬盘中读的) - all:Full Table Scan,将遍历全表以找到匹配的行
possible_keys:显示可能应用在这张表中的索引,一个或多个。查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询实际使用
key:查询中若使用了覆盖索引,则该索引和查询的select字段重叠