MySQL 为什么要使用索引及索引创建的原则有哪些?

2022-12-22 10:20:40 浏览数 (1)

B站搜索“乐哥聊编程“有本篇文章配套视频‍ https://www.bilibili.com/video/BV1se4y1t7fx

什么是索引

索引也是一种排好序的数据结构,它记录了原数据的单个列或多个列,通过索引查询,程序不需要查所有记录,只需要先按照索引查到具体的数据,然后在根据索引记录的指针位置,找到对应的原始数据记录。举个例子来说,索引就好比是我们书本的目录,我们通过目录能够快速定位到我们想看指定章节的页数,如果我们不适用索引,会是什么情况呢?我们最大可能就是从头往后方,一页一页确认去找。

为什么创建索引

因为索引在一定程度上,提高了数据库查询速度 在MySQL中有两种数据访问方式:顺序访问和索引访问。

顺序访问

顺序访问又叫全表扫描,也就是你要查数据时,它是从表的第一行一直按照你的条件进行匹配,直到最后一行,如果数据量比较少的情况下,这是没有问题,但是如果数据量很多,这种查询方式就有点够呛了,前端请求一个数据,直接把网站给干挂了。

索引访问

索引访问顾名思义就是我们在查询数据是在索引数据结构上执行的,索引数据首先是排好序的,其次他没有保存完整的数据列(聚集索引除外,它的完整记录是放在叶子节点中的) 这种访问方式前提是你已经建好索引,并且你检索的数据列存在索引表中,只有这样你才可以使用索引查询。如果创建了索引之后,当我们对数据进行更新操作时,需要同时更新和维护索引数据。

哪些情况下需要创建索引

  • 选择唯一性索引:唯一性索引的值是唯一的,可以更快速的通过索引来确定某条记录
  • 为经常需要排序、分组和联合操作的字段建立索引
  • 经常作为查询条件的字段建立索引
  • 尽量使用数据量少的索引,如果索引的值很长,那么查询的速度会受到影响
  • 尽量使用前缀来作为索引
  • 尽量选择区分度高的列作为索引,区分度高是指字段不重复的列,比如不要给性别或状态等列建立索引
  • 尽量的扩展索引,而不是新建索引
  • 在需要排序的字段上面建立索引
  • 在where子句中的字段建立联合索引
  • 联表查询时,要给关联字段创建索引

哪些情况下不建议创建索引

  • 重复度比较高的列不要设置索引
  • 对于定义为text,image,bit类型的列不要建索引
  • 如果数据列经常被修
  • 数据量小的表不要建索引,也许全表扫性能会更高
  • 不建议对无序的字段建立索引,如UUID(以前好像经常用,现在不怎么用了)
  • 不要对一个字段建立多个联合索引

索引优缺点

优点

  • 可以通过唯一索引保证数据唯一性
  • 加快数据的查询速度
  • 可以加速表和表的连接
  • 在查询过程中使用索引,还会触发mysql隐藏的优化器,提高查询性能

缺点

  • 索引的创建和维护需要消耗时间,并且还占据一部分额外的空间,并且随着数据量增大,索引占用的空间也会增大(但是和显著提升的性能来说,这也不算啥)
  • 当对表数据进行更新和删除时,需要同时维护索引记录,降低了数据的维护速度,有可能会出现数据更新了,但是索引没更新上(这种情况概率比较小)

总结

所以在创建索引时,我们要综合考虑索引优缺点和创建索引的规则(哪些该创建索引,哪些不该创建索引)。不能一味的为了创建索引而创建索引。

0 人点赞