mysql之索引
Posted xiaokaige
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql之索引相关的知识,希望对你有一定的参考价值。
1,索引是什么?
答:索引是一种用于快速查找的数据结构,并且已经排好顺序。索引也要占用空间,有一定维护成本。索引的增删改会引起
索引变形,要始终保持索引高效搜索,则要维护索引的平衡。这是很耗资源的。
innodb索引逻辑结构如下:
情况一,主键索引
情况二,辅助索引
从上图可知即为树形结构,叫B+树,对于innodb而言主键索引的叶子节点存储行数据,行是村在页里面,各个叶子指针相互关联,
由此可得知,因为索引有序,行记录就有序,所以一个表只能有一个主键索引,各个叶块指针关联,方便范围查找。
辅助索引叶子节点存的是主键值,如果要查tom,大致需要6个IO操作,先通过secondary key 一级一级查找到 tom的主键为49,然后再
通过主键索引查到49的叶子节点。假如一级一个IO,这里则要6个IO。
2,索引有什么用?
快速检索数据,排序,分组,避免全表搜索。如果表数据很小,索引也没啥用。
3,索引的类型
a,主键索引
b,单列索引(表中选取一列作为索引)
c,多列索引 (表中选取多列一起构成索引)
d,唯一索引 (可以是几个列组合起来成为唯一索引)
e,全文索引 (不介绍)
4,怎么最优的使用索引
a,看懂执行计划 查询的时候是否使用到了索引
desc select * from table where xxxx 查看执行计划
重点看type,type取值如下 ,是较为重要的一个指标,结果值从好到坏依次是:
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
一般来说,得保证查询至少达到range级别,最好能达到ref。
挑几个常见的解释一下:
all,没有使用索引,全表扫描,最糟糕了
index,没有全表扫描,而是扫描全部索引树,一般索引的体积比表小,io还是减小了
range,索引范围扫描,返回匹配值域的行。范围又缩小了,常见于between、<、>等的查询
ref, 非唯一性索引扫描,返回匹配某个单独值的所有行。
eq_ref ,唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描。
const,好的不的了,无需解释。
上述类型很多,常见就这几种,理解一下就是从索引上获得了什么,每次从索引上获得的记录条数越少越好,all就是没用,
index就是全部索引走了一遍,range多个索引key值,缩小了一下范围,ref单个索引key值,eq_ref单条记录。
5,避免坑
未完待续.........................................
以上是关于mysql之索引的主要内容,如果未能解决你的问题,请参考以下文章