美文网首页
MySQL实战 | 09 普通索引还是唯一索引?

MySQL实战 | 09 普通索引还是唯一索引?

作者: hoxis | 来源:发表于2019-02-26 12:28 被阅读40次

    普通索引和唯一索引如何选择?

    脑图地址:https://mubu.com/doc/aRFaYEd5EG

    • 几种索引
      • 普通索引
        • 作用:加快对数据的访问速度
        • 一般加在经常查询或者排序的字段上
        • 允许字段值重复
      • 唯一索引
        • 保证数据记录的唯一性
        • 目的是为了避免数据重复
        • 维护数据完整性
    • 如何选择
      • 查询效率
        • 普通索引会查询多个,需要多出查找和判断下一条记录的动作
        • 唯一索引查询一次
        • 性能差不多
          • InnoDB 的数据是按数据页为单位来读写的
          • 一个数据页可以放近千个 key
          • 很少出现跨数据页查询的情况
      • 更新效率
        • change buffer
          • 更新数据页时,若数据页在内存中,则直接更新
          • 若数据页不在内存中,则先将更新操作缓存在 change buffer 中
          • redo log 里记录了数据页的修改以及 change buffer 新写入的信息
          • 下次查询时,先将数据读入内存,然后再执行缓存在 buffer 中的操作
          • 可以持久化,在内存中有拷贝,也会写入磁盘
          • 何时 merge 数据?
            • 访问该数据页
            • 后台定期 merge
            • 关闭数据库时
          • 优点
            • 减少磁盘读 IO
        • 唯一索引的更新过程
          • 唯一索引需要确保数据的唯一性
          • 若目标数据页不在内存中,需要将数据读取到内存
          • 不会使用到 change buffer,直接在内存中更新
        • 普通索引
          • 若目标数据页不在内存中,直接将更新缓存到 change buffer 中
          • 适合写多读少的业务
          • 若写完立马就读,就需要数据的 merge
          • 不但不能减少磁盘 IO,会增加了 change buffer 的维护代价
        • 结论
          • 数据从磁盘读入内存涉及随机 IO 的访问
          • 唯一索引的更新代价更大
    • 索引最终选择
      • 查询能力上差别不大
      • 更新性能差别较大
      • 若业务没有字段的唯一性要求,推荐使用普通索引
      • 另外,就算有唯一性需求,唯一性也可以用业务层来保证,例如 uuid
      • 普通索引和 change buffer 的配合使用,对于数据量大的表的更新优化还是很明显的
    普通索引还是唯一索引
    你的关注是对我最大的鼓励!

    关注本公众号,后台回复「2018」即可获取传智播客 2018 最新 Python 和 Java 教程。

    公众号提供CSDN资源免费下载服务!


    相关文章

      网友评论

          本文标题:MySQL实战 | 09 普通索引还是唯一索引?

          本文链接:https://www.haomeiwen.com/subject/mjkayqtx.html