聊聊mysql索引

聊聊mysql索引

描述

mysql索引是空间换时间的一种方式,主要是提高查询效率,相应的要付出额外的存储空间,mysql索引使用的是B+树。

常见的索引模型

哈希表,有序数组,搜索树。

为什么是B+树

B+树的特点:

  • 节点的子树数和关键字数相同
  • 节点的关键字表示的是子树中的最大数,在子树中同样含有这个数据
  • 叶子节点包含了全部数据,同时符合左小右大的顺序

在这里插入图片描述

如果N为1200,树高为4,则可以存1200的3次方数据约17亿。查询一个值最多访问3次磁盘。减少了磁盘io访问次数。

InnoDB索引模型

InnoDB使用的B+树索引,每一个索引对应一个B+树。索引主要分为两类,主键索引和非主键索引。主键索引(聚簇索引)叶子节点存储的是整行数据。
非主键索引(二级索引)叶子节点存储的是主键的值。

在这里插入图片描述
因此查询的时候如果是走主键索引查询的话就直接查出来了数据行。如果走普通索引第一步是先通过索引查询到主键值,然后通过主键值再查询一次数据值,俗称回表。

索引维护

为了保持索引的有序性,因此我们再插入和删除的时候需要做索引维护。
如果插入的是最大值则比较简单只需要再最后面插入值即可。如果是插入中间值需要逻辑后移后面的数据,空出所需要的位置。这种情况比较复杂,涉及到页分裂的问题,我们每个索引页大概16kb的数据。因此在插入和删除数据时均会涉及到性能方面的影响。
同理,我们主键使用自增索引(id bigint(20) unsigned NOT NULL AUTO_INCREMENT Comment ‘主键id’,)主要会有两方面考量,第一,每次插入一条新数据,都是追加操作,不会涉及到其他数据的改动,也不会触发叶子节点的分裂。第二,bigint就8个字节,因为普通索引的叶子节点存储的是主键的值,因此节省了空间。

索引优化

  1. 减少回表:当涉及到多个字段查询时,可以通过创建组合索引的方式减少回表。
  2. 主键索引尽量使用自增主键。从空间和性能上考量。
  3. 字段散列不够大,或者字段内容过长是不适合加索引。
  4. explain关键字去查看sql的执行情况。
  5. 当需要排序时尽量使用索引字段order by。索引自身已经排过序了。
  6. 字符串建索引时,可以前缀匹配字符串,为了增加字符串的散列度可以字符串翻转,或者hash运算等。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当我们在MySQL中创建表时,可以为某个列或多个列创建索引,这可以加快查询速度。索引是一种特殊的数据结构,可以让对数据库表的某些操作更快,比如查找、排序和分组。 MySQL中的索引主要有以下几种类型: 1. 唯一索引:保证索引列的唯一性,可以为空。 2. 主键索引:是一种特殊的唯一索引,用于标识表中的每一行。一个表只能有一个主键。 3. 普通索引:最基本的索引类型,没有任何限制。 4. 全文索引:用于全文搜索,可以在大量文本数据中进行高效的搜索。 5. 复合索引:包含多个列的索引,可以提高查询性能,尤其是在多个列共同筛选的情况下。 当我们使用索引时,需要注意以下几点: 1. 索引不是越多越好,过多的索引会导致写操作变慢,因为每次写操作都需要更新所有相关的索引。所以,只有在需要查询的列上创建索引才是最优的。 2. 索引的选择性越高,查询速度就越快。选择性可以通过计算不同值的数量与总行数的比例来衡量。如果选择性很低,那么查询的效果就会很差。 3. 当我们使用多个列进行筛选时,可以创建复合索引来提高查询速度。要注意的是,索引的顺序很重要,应该将选择性高的列放在前面。 4. 索引不会自动更新,当我们对表进行插入、删除或更新操作时,需要更新索引,否则索引会变得失效,导致查询性能下降。 总之,索引是优化MySQL查询性能的重要手段,但是在使用时需要谨慎,选择恰当的索引类型和创建方式才能真正发挥其作用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值