索引的类型(索引有很多种类型,在mysql中,并没有统一的索引标准,不同的存储引擎的索引的工作方式并不一样,也不是所有的存储引擎都支持所有类型的索引)
1、B-Tree索引 大多数MySQL引擎都支持这种索引,对索引列是顺序组织存储的,很适合查找范围数据。如:像找出所有以I到K开头的名字“这样的查找效率会非常高。适用于全键值,键值范围或键前缀(最左前缀的查找)查找。
2、哈希索引 哈希索引只包含哈希值和行指针,而不存储字段值。
无法用于排序,不是按照索引值顺序存储的
不支持部分索引列匹配查找(哈希索引是使用索引列的全部内容来计算哈希值得)
只支持等值比较查询,包括=、IN()、<=>
不支持任何范围查询
3、空间数据索引(R-Tree)
MyISAM索引支持空间索引。 无须前缀查询,会从所有维度索引数据
4、全文索引
5、其他索引类别
(第三方的存储引擎来存储索引,如:TokuDB 分形树索引)
常见的索引有:
1. 普通索引(无限制)
2.唯一索引
主键就是唯一索引,但是唯一索引不一定是主键,唯一索引可以为空,但是空值只能有一个,主键不能为空。
普通唯一索引:单个字段上建立唯一索引,需要此字段所在的列上不能有重复的值,属于二级索引。
复合唯一索引:多个字段上联合建立唯一索引,属于二级索引。(参考了:https://www.jianshu.com/p/e1dce41a6b2b
3.单列索引
4.多列索引(前缀)
5.覆盖索引 : 一个索引包含(或者说覆盖)所有需要查询的字段的值
6.聚族索引
InnoDB 主键使用的是聚簇索引,MyISAM 不管是主键索引,还是二级索引使用的都是非聚簇索引。
聚族索引不是一种单独的索引类型,而是一种数据存储方式。InnoDB的聚族索引在同一结构中保存了B-Tree索引和数据行。数据行存放在索引的叶子页中,术语"聚族"表示数据行和相邻的键值紧凑地存储在一起。存储引擎负责实现索引(不是所有的存储引擎都支持聚族索引)。
InnoDB将通过主键聚集数据,如果没有定义主键,InnoDB会选择一个唯一的非空索引代替。如果没有这样的索引,InnoDB会隐式定义一个主键来作为聚族索引。
优点:1、数据访问更快,聚族索引将索引和数据保存在同一个B-Tree中,因此比在非聚族索引中获取数据更快。
2、使用覆盖索引扫描的查询可以直接使用页节点的主键值。
缺点: 1.插入速度严重依赖于插入顺序。按照主键的顺序插入是加载数据到InnoDB表中速度最快的方式。但如果不是按主键插入,最好使用optimize table命令重新组织表
2.更新聚族索引列的代价很高。因为会强制InnoDB将每个被更新的行移动到新的位置。
3..基于聚族索引的表在插入新行,或者主键被更新导致需要移动行的时候,可能面临“”页分页“的问题。
当行的主键值要求必须将这一行插入到某个已满的页中时,存储引擎会将改页分页成两个页来容纳该行,这就是一次页分页操作,会导致表占用更多的磁盘空间。聚族索引可能导致全表扫描变慢,尤其是行比较稀疏或者是页分裂存储不连续的时候。
二级索引叶子节点保存的不是指向行的物理位置的指针,而是行的主键值。
7.全文索引
InnoDB 主键使用的是聚簇索引,MyISAM 不管是主键索引,还是二级索引使用的都是非聚簇索引。
版权声明:本文为博主原创文章,未经博主允许不得转载。