索引
-
加快查询速度的手段,能快速定位到需要查询的内容
-
对表中的一列或多列进行排序的结构
-
得另外组织索引属性值+相应元组指针,占用一定的存储空间,当基本表更新的时候,索引要进行相应的维护
-
提高了查询速度,同时却会降低更新表的速度,占用磁盘空间的索引文件
哪些键要索引:
主键、经常需要用来搜索、排序、连接的键
索引分哪几种:
-
按物理存储的角度:聚集索引(聚簇索引的顺序,就是数据在硬盘上存储的物理顺序,所以一个表中只能有一个)、非聚集索引(用B+树,叶子结点有指向表记录的指针)(聚簇索引的叶子节点就是数据节点,而非聚簇索引的叶子节点仍然是索引节点,只不过有指向对应数据块的指针。)
-
按逻辑角度:主键索引(不允许空值)、普通索引(没有任何限制)、唯一索引(索引列的值必须唯一)、复合索引(多个字段上建立的索引,提高复合条件查询的速度)、
(主键指的是在一个属性组中能够唯一标识一条记录的属性或属性组。)
主键索引和普通索引有什么区别:
-
普通索引是最基本的索引类型,没有任何限制,值可以为空,仅加速查询。普通索引是可以重复的,一个表中可以有多个普通索引。
-
主键索引是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值;索引列的所有值都只能出现一次,即必须唯一。简单来说:主键索引是加速查询 + 列值唯一(不可以有null)+ 表中只有一个。
Mysql索引主要有两种结构:B+Tree索引和Hash索引
-
Hash索引把数据以hash形式组织起来,因此当查找某一条记录的时候,速度非常快。但是因为hash结构,每个键只对应一个值,而且是散列的方式分布。所以它并不支持范围查找和排序等功能。
-
B树的优势是当你要查找的值恰好处在一个非叶子节点时,查找到该节点就会成功并结束查询。但不支持范围查询,且如果要扫库的话,只能中序遍历把所有结点都走一遍。
-
B+Tree所有索引数据都在叶子节点上,叶节点为属性值和对应的元祖指针。非叶结点都只是向下查找的索引部分,只含有其子树中的最大(或最小)关键字,无论查找成功与否,查找从从根到叶子节点才能终止。
-
B+树增加了顺序访问指针,每个叶子节点都有指向相邻叶子节点的指针。可以提高区间效率,例如查询key为从18到49的所有数据记录,当找到18后,只要顺着节点和指针顺序遍历就可以以此向访问到所有数据节点,极大提高了区间查询效率。大大减少磁盘I/O读取。要扫库的话,直接从叶子结点挨个扫一遍就完了,B+树支持range-query非常方便。
hash冲突解决办法
- 链地址法:把关键字相同的记录记在一个单链表里
- 公共溢出区法:给冲突的关键字一个公共的溢出区来存放
- 再hash法:再用一个hash来算
- 开放寻址法 :一旦冲突,就去找下一个空的位置
覆盖索引
-
指一个查询语句的执行只用从索引中就能够取得,不必从数据表中读取
-
避免了查到索引后再返回表操作,减少I/O提高效率
-
遇到以下情况,执行计划不会选择覆盖查询:1.select选择的字段中含有不在索引中的字段 ,即索引没有覆盖全部的列。2.where条件中不能含有对索引进行like的操作。
常见问题
数据库索引的作用
创建过多索引表会有什么影响
索引的优缺点
索引分哪几种,哪些键要索引
索引的数据结构