• Mysql索引知识补充


    参考:

    普通索引和唯一索引,难道还分不清 - 知乎

    普通索引和唯一索引有什么区别?

    1.从概念上来说,普通索引可重复,唯一索引和主键一样不能重复。

    2.在一张表里面只能有一个主键,不能为空,唯一索引可有多个。唯一索引可有一条记录为null。

    3.查询性能:

    select id from T where k=4

    普通索引:查找到满足条件的第一个记录(4,400)后,继续查找下个记录,直到碰到第一个不满足k=4的记录

    唯一索引:查到第一个满足条件的,就停止搜索

    InnoDB数据按数据页单位读写。即读一条记录时,并非将该一个记录从磁盘读出,而以页为单位,将其整体读入内存。

    所以普通索引,多了一次“查找和判断下一条记录”的操作,即一次指针寻找和一次计算。

    极端情况的性能差异:若k=4记录恰为该数据页的最后一个记录,则此时要取下个记录,还得读取下个数据页。

    对整型字段,一个数据页可存近千个key,因此这种情况概率其实也很低。因此计算平均性能差异时,可认为该操作成本对CPU开销忽略不计。

    4.更新性能:

    往表中插入一个新记录(4,400)

    该记录要更新的目标页是否在内存。

    (1)如果在内存:

    • 普通索引
      找到3和5之间的位置,插入值,结束。
    • 唯一索引
      找到3和5之间的位置,判断到没有冲突,插入值,结束。

    只是一个判断的差别,耗费微小CPU时间。

    (2)如果不在内存:

    • 唯一索引
      将数据页读入内存,判断到没有冲突,插入值,结束。
    • 普通索引
      将更新记录在change buffer,结束。

    将数据从磁盘读入内存涉及随机I/O访问,是DB里成本最高的操作之一。而change buffer可以减少随机磁盘访问,所以更新性能提升明显。

    总结:普通索引、唯一索引在查询性能上无差别,主要考虑更新性能。所以,推荐尽量选择普通索引。

    Change Buffer:Change Buffer详解-CSDN博客

  • 相关阅读:
    【数据库】数据库绪论,你都会了吗
    css外边距塌陷(合并)
    如何提高团队开发质量
    Github 星标 57.9K!阿里巴巴 Java 面试突击汇总(全彩版)首次公开
    react: zustand数据缓存
    QT 智能指针注意事项(备忘)
    [极客大挑战 2019]Upload
    实现我们mysql的主从复制
    java-数据迁移-定制拓展
    【洛谷】P2082 区间覆盖(加强版)(经典模拟)
  • 原文地址:https://blog.csdn.net/Miaodawang/article/details/133325710