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之索引的主要内容,如果未能解决你的问题,请参考以下文章

MySQL之索引

mysql 优化之索引的使用

MySQL之索引

mysql之高性能索引

MySQL 之索引类型

MySQL 之索引类型