数据库索引知识

索引

什么是索引

索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表所有记录的引用指针。
索引是一种数据结构。数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用通常使用B树及其变种B+树
更通俗的说,索引就相当于目录。为了方便查找书中的内容,通过对内容建立索引形成目录。索引是一个文件,它是要占据物理空间的。

索引有哪些优缺点?

索引的优点

  • 可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
  • 通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
    索引的缺点
  • 时间方面:创建索引和维护索引要耗费时间,具体地,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,会降低增/改/删的执行效率
  • 空间方面:索引需要占物理空间。

索引使用场景(重点)

因为id字段建立了主键索引,因此此SQL执行可选的索引只有主键索引,如果有多个,最终会选择一个较优的作为检索的依据。
建立索引会发现查询的效率会有明显的提升

orderby

当我们使用order by 将查询结构按照某个字段排序时,如果该字段没有建立索引,俺么执行计划会将查询出的所有数据使用外部排序(将数据从硬盘分批读取到内存使用内部排序,最后合并排序结果),这个操作是很影响性能的,因为需要将查询涉及到的所有数据从磁盘中读到内存(如果单条数据过大或者数据量过多会降低效率),更无论读到内存之后的排序了。
但是我嫩如果对字段建立索引alter table 表名 add index(字段名),那么由于索引本身是有序的,因此直接按照索引的顺序和映射关系逐条取出数据即可。而且如果分页的,那么只用取出索引表某个范围内的索引对应的数据,而不用像上述那取出所有数据进行排序再返回某个范围内的数据(从磁盘取数据是最影响性能的)。

join

对join语句匹配关系(on)涉及的字段建立索引能提高效率
索引覆盖
如果要查询的字段都建立过索引,那么引擎会直接在索引表中查询而不会访问原始数据(否则只要有一个字段没有建立就会做全表扫描),这叫索引覆盖。
因此我们需要尽可能的在select后只写必要的查询字段,以增加索引覆盖的几率。
值得注意的是不要想着为每个字段建立索引,因为优先使用索引的优势就在于其体积小

索引有哪几种类型?

主键索引:数据不允许重复,不允许为NULL,一个表只能有有一个主键。
唯一索引: 数据列不允许重复,允许为NULL,一个表允许多个列创建唯一索引。

  • 可以通过ALTER TABLE table_name ADD UNIQUE(column)创建唯一索引
  • 可以通过ALTER TABLE table_name ADD UNIQUE(column1,colunma2)创建一组合索引

普通索引:基本的索引类型,没有唯一性的限制,允许为NULL值。

  • 可以通过ALTER TABLE table_name ADD index_name(column);创建普通索引。
  • 可以通过ALTER TABLE table_name ADDindex_name(column1,column2,column3)创建组合索引
    全文索引:是目前搜索引擎使用的一种关键技术
  • 可以通过ALTER TABLE table_name ADD FULLTEXT(column);创建全文索引

索引的数据结构(b树,hash)

索引的数据结构合具体存储引擎的实现有关,在MySQL中使用较多的索引有Hash索引,B+树索引等,而我们经常使用的InnoDB存储引擎的默认索引实现为B+树索引,对于哈希索引来说,底层的数据结构就是哈希表,因此在绝大多数需求为单条记录的时候,可以选择哈希索引,查询性能最快;其余大部分场景,建议选择BTree索引。

  • B树索引
    mysql通过存储引擎取数据,基本上90%的人使用的就是InnoDB了,按照方式分,InnodDB的索引类型目前只有两种:BTREE(B树)索引合HASH索引。B树索引是Mysql数据库中使用最频繁的索引类型,基本所有存储引擎都支持BTree索引。通常我们说的索引不出意外指的是(B树)索引(实际是用B+树)实现的,因为在查看表索引的时,mysql一律打印BTREE,所以简称为B树索引

查询方式

  • 主键索引区:PI(关联保存的时数据的地址)按主键查询
  • 普通索引区:si(关联的id的地址,然后再到达上面的地址),索引按主键查询,速度最快。

B+tree性质:

  • n棵tree的节点包含n个关键字,不用来保存数据而是保存数据的索引。
  • 所有的叶子节点包含了全部关键的信息,及指向这些关键字记录的指针,且叶子节点本身依关键字的大小自小而大顺序链接。
  • 所有的非终端节点可以看成是索引部分,节点中仅含其子树中的最大(或最小)关键字。
  • B+树中,数据对象的插入合删除仅在叶节点上进行。
  • B+树有2个头指针,一个是树的根节点,一个是最小关键码的叶节点。

哈希索引

简要说下,类似于数据结构中简单实现的HASH表(散列表)一样,当我们再mysql中用哈希索引时,主要就是通过Hash算法(常见Hash算法有直接定地址法、平方取中法、折叠法、除数取余法、随机数法),将数据库字段数据转换成定长的Hash值,与这条数据的行指针一并存入Hash表的对应位置;如果发生Hash碰撞(两个不同关键字的Hash相同),则在对应Hash键下以链表形式存储。

索引的基本原理

索引用来快速地寻找哪些具有特定值的记录。如果没有索引,一般来说执行查询时遍历整张表。
索引的原理很简单,就是把无序的数据变成有序的查询

  • 把创建了索引的列的内容进行排序。
  • 对排序结果生成倒排表
  • 在倒排表内容上拼上数据地址链
  • 在查询的时候,先拿到倒排表内容,再取出数据地址链,从而拿到具体数据。

原文作者:不会笑的孩子

原文链接:https://www.cnblogs.com/doubleconquer/p/16778841.html(版权归原文作所有,侵权留言联系删除)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值