首页 > 其他分享 >唯一索引、普通索引的使用场景

唯一索引、普通索引的使用场景

时间:2024-12-09 21:32:13浏览次数:7  
标签:场景 buffer key1 更新 唯一 索引 id change

假设我们有两个表 t1 和 t2:

CREATE TABLE t1 (
    id INT NOT NULL AUTO_INCREMENT,
    key1 VARCHAR(100)
    PRIMARY KEY (id),
    KEY idx_key1 (key1)
) Engine=InnoDB CHARSET=utf8;

CREATE TABLE t2 (
    id INT NOT NULL AUTO_INCREMENT,
    key1 VARCHAR(100)
    PRIMARY KEY (id),
    UNIQUE KEY idx_key1 (key1)
) Engine=InnoDB CHARSET=utf8;

t1 和 t2 的唯一区别在于:对于列 key1,表 t1 是建立了普通索引,表 t2 是建立了唯一索引。现在分别往两个表插入一样的数据 R1~R5 ,对应的 (id,key1) 值分别为 (100,1)、(200,2)、(300,3)、(500,5) 和 (600,6)。

1.查询过程

假设,执行查询的语句是 select id from test where k=5

对于普通索引来说,查找到满足条件的第一个记录 (5,500) 后,需要查找下一个记录,直到碰到第一个不满足 k=5 条件的记录。

对于唯一索引来说,由于索引定义了唯一性,查找到第一个满足条件的记录后,就会停止继续检索。

那么,这个不同带来的性能差距会有多少呢?答案是,微乎其微 。

2.更新过程

为了说明普通索引和唯一索引对更新语句性能的影响这个问题,介绍一下 change buffer

当需要更新一个数据页时,如果数据页在内存中就直接更新,而如果这个数据页还没有在内存中的话,在不影响数据一致性的前提下, InooDB 会将这些更新操作缓存在 change buffer 中 ,这样就不需要从磁盘中读入这个数据页了。在下次查询需要访问这个数据页的时候,将数据页读入内存,然后执行 change buffer 中与这个页有关的操作。通过这种方式就能保证这个数据逻辑的正确性。

change buffer 中的操作应用到原数据页,得到最新结果的过程称为 merge 。除了访问这个数据页会触发 merge 外,系统有后台线程会定期 merge。在数据库正常关闭(shutdown)的过程中,也会执行 merge操作。

如果能够将更新操作先记录在 change buffer, 减少读磁盘,语句的执行速度会得到明显的提升。

而唯一索引的更新不能使用 change buffer ,实际上也只有普通索引可以使用。因此,对于需要频繁更新的字段,建议用普通索引。

3.总结

  • 对于需要频繁更新的字段,建议用普通索引,因为他能通过使用 change buffer 来提升更新表的性能。此外,如果所有的更新后面,都马上伴随着对这个记录的查询 ,那么你应该关闭 change buffer
  • 如果数据需要保证唯一性,但业务无法保证,即需要数据库来保证唯一性。那为了业务的正确性,就必须要用唯一索引。
  • 对于联表查询的情况,可以考虑将被驱动表的连接字段设置为唯一索引,因为 InnoDB 在选择执行计划前会去计算成本,而唯一索引的成本一般被认为是更低的,那生成的执行计划就会更加偏向于走索引。

标签:场景,buffer,key1,更新,唯一,索引,id,change
From: https://blog.csdn.net/weixin_43987408/article/details/144358266

相关文章

  • Python与人工智能37——字符串全排列与算法应用场景
    ......
  • Dexie.js 库 增删改查indexdb示例,游标、索引使用等
    增删改查以下是如何使用Dexie.js库进行增删改查操作的示例:1.初始化数据库首先,你需要安装Dexie.js:npminstalldexie然后,在你的代码中引入并初始化Dexie.js:importDexiefrom'dexie';constdb=newDexie('myDatabase');db.version(1).stores({myObjectStore:......
  • Mysql索引失效问题demo
    Mysql索引失效问题demo#1.准备工作CREATETABLE`user`(`id`INTNOTNULLAUTO_INCREMENT,`code`VARCHAR(20)COLLATEutf8mb4_binDEFAULTNULL,`age`INTDEFAULT'0',`name`VARCHAR(30)COLLATEutf8mb4_binDEFAULTNULL,`height`INTDEFAULT&#......
  • NAT原理:概念、使用场景、转发流程及规则
    本文分享自天翼云开发者社区《NAT原理:概念、使用场景、转发流程及规则》,作者:x****n网络地址转换(NAT)是一种在计算机网络中将一个网络的IP地址转换为另一个网络的IP地址的技术。它通常用于将私有网络的IP地址映射到公共网络的IP地址,以便在Internet上进行通信。NAT技术解决了IPv4地......
  • Halcon 轮廓检测常用算子、原理及应用场景
    一、引言在机器视觉领域,轮廓检测是一项关键技术,它能够提取物体的边缘信息,从而实现物体的定位、识别、测量等多种功能。Halcon作为一款强大的机器视觉软件库,提供了丰富的轮廓检测算子。本文将详细介绍Halcon中轮廓检测的常用算子、原理及其应用场景。二、Halcon轮廓检测......
  • Halcon 中各种拟合算子原理及应用场景
    一、引言在机器视觉和图像处理领域,拟合操作是一种非常重要的技术手段。Halcon作为一款强大的机器视觉软件库,提供了多种拟合算子来处理不同类型的数据,如点、线、曲线等,从而帮助用户从复杂的数据中提取出有价值的几何信息。这些拟合算子基于严谨的数学原理,并且在不同的工业检测......
  • 面经自测——MySQL联合索引/事务的四大特性/持久性怎么做/说一下MySQL日志
    前言本文是作者专门用来自测Java后端相关面试题的,所有问题都是在牛客、知识星球或网上找到的最近最新的面试题,全文回答都是作者按自己的真实水平仿照真实环境的回答,所以答案不一定真实(但回答一定真诚......
  • 【java常用算法和应用场景】
    java常用算法和应用场景Java中常用的算法涵盖多个领域,包括排序算法、查找算法、字符串匹配算法、图论算法、动态规划算法、贪心算法、分治算法等。以下是Java中一些常用算法及其应用场景和示例代码:一、排序算法排序算法是计算机科学中的一种基本算法,它可以将一组数据按照......
  • 请举例说明width:fit-conten有什么使用场景
    width:fit-content在前端开发中非常有用,它允许元素根据其内容的宽度自适应大小,避免了硬编码宽度带来的问题。以下是一些使用场景:1.动态内容的容器:按钮:当按钮文本长度不固定时,width:fit-content可以确保按钮的宽度正好包裹住文本,并随着文本的变化而调整。例如,多语言......
  • css中的fill有什么应用场景?
    在CSS中,fill属性主要用于控制SVG元素中图形的填充颜色。它不适用于常规的HTML元素。以下是fill的一些常见应用场景:改变SVG图标颜色:这是fill最常用的场景。你可以使用任何有效的CSS颜色值,包括颜色名称(如red、blue)、十六进制值(如#FF0000)、RGB值(如rgb(255,......