首页
学习
活动
专区
圈层
工具
发布

MySQL唯一索引和普通索引

InnoDB; insert into t(id, name, k) values (1, 'Java', 100), (2, 'Python', 200), (3, 'Go', 300), (5, 'MySQL...普通索引和唯一索引查询 select * from t where k = 500; 查询语句会在k索引树上的树根开始,按层搜索到叶子节点(点位到右下角的数据页),然后在数据页内部再通过二分法定位记录...,找到300和500之间的位置,判断没有冲突,插入该值,语句执行结束 如果是普通索引,找到300和500之间的位置,插入该值,语句执行结束 假设记录要更新的目标页不在内存中,处理流程如下: 如果是唯一索引...,需要将数据页读入内存,判断没有冲突插入该值,语句结束 如果是普通索引,则将更新记录在change buffer,语句执行结束。...唯一索引和普通索引 唯一索引和普通索引在查询性能上基本没有差别,但在更新上普通索引会快于唯一索引。所以在可以选择普通索引的前提下尽可能选择普通索引。

2.6K10

MySQL中使用 普通索引 or 唯一索引?

MySQL中可以创建普通索引与唯一索引,这两种索引的区别是: 普通索引(Non-Unique Index),也称为非唯一索引,它允许索引中的条目具有重复的键值。...普通索引的主要目的是加快查询速度,它并不关心数据的唯一性。 普通索引的特点: 可以包含重复的索引键值。 适用于快速查找具有相同索引值的多个记录的场景。 不保证数据的唯一性。...普通索引创建方法: CREATE INDEX idx_email ON customers(email); 唯一索引(Unique Index)是一种数据库索引,它要求索引中的所有键值都是唯一的。...如果尝试插入或更新记录以产生重复的索引键值,数据库将拒绝这种操作。 唯一索引的特点: 保证索引中的键值是唯一的。 适用于确保数据表中某一列或列组合的唯一性,例如身份证号、用户名等。...普通索引改成唯一索引后,某个业务的库内存命中率突然从 99% 降低到了 75%,整个系统处于阻塞状态,更新语句全部堵住。

1.9K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    MySQL选择普通索引还是唯一索引(216)

    普通索引和唯一索引 基本概述 MySQL中可以创建普通索引与唯一索引,这两种索引的区别是: 普通索引(Non-Unique Index),也称为非唯一索引,它允许索引中的条目具有重复的键值。...普通索引的主要目的是加快查询速度,它并不关心数据的唯一性。 普通索引的特点: 可以包含重复的索引键值。 适用于快速查找具有相同索引值的多个记录的场景。 不保证数据的唯一性。...普通索引创建方法: CREATE INDEX idx_email ON customers(email); 唯一索引(Unique Index)是一种数据库索引,它要求索引中的所有键值都是唯一的。...如果尝试插入或更新记录以产生重复的索引键值,数据库将拒绝这种操作。 唯一索引的特点: 保证索引中的键值是唯一的。 适用于确保数据表中某一列或列组合的唯一性,例如身份证号、用户名等。...普通索引改成唯一索引后,某个业务的库内存命中率突然从 99% 降低到了 75%,整个系统处于阻塞状态,更新语句全部堵住。

    1.4K10

    MySQL普通索引和唯一索引的选择

    查询对比 由于在业务层面保证了车牌号的唯一性,那么数据库中有且只有一条车牌号为’鲁B 12345’的车辆信息,那么普通索引只会比唯一索引多一次指针寻址和一次计算,对于当前服务器的CPU性能来说,差距微乎其微...插入一条数据,InnoDB的处理流程是怎样的 要更新的目标在内存中 对于唯一索引来说,找到待插入的位置,然后判断待插入的数据有无重复性冲突,插入值,语句结束。...对于普通索引来说,找到待插入位置,插入值,语句结束。 当目标页在内存中时,唯一索引和普通索引在插入时性能差距微乎其微。...要更新的目标不在内存中 对于唯一索引来说,需要先将数据页读入内存,查询待插入数据是否已存在,判断没有冲突,插入这个值,语句执行结束。...引用自极客时间《MySQL实战45讲》

    1.9K20

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

    相信大家对唯一索引和普通索引是有一定的了解的,那么在不同的业务场景,使用唯一索引还是普通索引呢,比如下面的场景 假设你在维护一个账户系统,每一个人都有一个唯一的身份证,而业务也能保证他的唯一性,此时我们设置唯一索引和普通索引其实都是可以的...,也就是上图的右下角的数据页,然后通过数据页内容通过二分法定位记录 对于普通索引,查询到满足的而第一个记录后,需要向后继续寻找,直到不满足条件 对于唯一索引,由于索引的唯一性,查询到数据后,直接停止查询...以上就是change buffer基本原理,现在我们看看更新操作,插入(4,400)记录,分为两种情况 第一种是更新的记录在内存中 对于唯一索引找到3和5之间的位置,判断没有冲突就插入这个值,语句结束...对于普通索引找到3和5之间的位置,插入这个值,语句结束 这种情况差距就是判断冲突的操作,影响差别不大 第二种更新记录不在内存中 对于唯一索引,需要将数据页读入内存中,判断有没有冲突,插入这个值,语句结束...对于普通索引,仅仅把更新操作记录在change buffer中,语句结束 减少从磁盘读入内存以及随机IO访问,是数据库性能提高的操作之一,而change buffer就是在较少随机访问磁盘的操作,因此对性能的提高是很明显的

    2.7K20

    mysql学习笔记(四)普通索引还是唯一索引

    这一篇主要来分析下如何选择普通索引和唯一索引,以及他们在查询时候的原理。 一、change buffer mysql引擎在查询的时候在存储引擎中提供了内存来帮助我们提高查询的效率。...那么在语句的更新操作下有没有什么中间区域来帮助我们提高效率呢? mysql在内存与数据页之间使用了change buffer的概念来帮助我们提示更新的效率。...(2)mysql引擎后台有线程会定期进行同步。 (3)数据库正常关闭之前,也会进行同步 以上的change buffer更新操作应用到数据页的过程我们可以叫做merge。...二、普通索引和唯一索引的查询过程 查询语句:select id from user where phone = '1234';假设在内存中没有该数据页的情况。...2、唯一索引 对于唯一索引,根据二分查找找到满足条件的记录后,根据唯一索引的唯一性,找到第一个就可以停止查找。

    1.4K20

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

    MySQL 普通索引和唯一索引该如何选择? 普通索引和唯一索引在查询能力上没啥差别,主要考虑对更新性能的影响,要尽量选择普通索引。接下来分析两种索引在查询语句和更新语句对性能的影响。...对于唯一索引来说,定义了唯一性,找到了第一个满足条件的记录后,停止检索。...唯一索引不会使用 Change buffer ,如果索引设置了唯一属性,在进行插入或者修改操作时,InnoDB 必须进行唯一性检查,如果不读取索引页到缓冲池,无法校验索引是否唯一,但是可以进行缓冲删除操作...普通索引能够使用 change buffer ,但是唯一索引不行,因此 普通索引比唯一索引更新操作快。...change buffer 使用场景 适合的场景 非唯一索引 业务写多读少,或者不是写后立即读场景。 不合适场景 数据库都是唯一索引 写入一个数据后,会立即读取它。

    2.2K20

    【MySQL】MySQL中SQL语句的索引分析

    MySQL中SQL语句的索引分析 了解过 索引 的概念以及 B+树 的概念之后,我们就来看看怎么分析一条查询语句的索引使用情况。...EXPLAIN语句 接下来,我们使用 EXPLAIN 来查看这条语句。...const 根据主键或唯一索引进行等值查询时,MySQL 发现能对查询条件优化成常数时,访问方法就是 const 。常数级别也就是速度非常非常快,常见于主键等值查询。...----+---------+-------+------+----------+-------+ 1 row in set, 1 warning (0.00 sec) eq_ref 在使用主键或者唯一索引时会看到...连接查询时,如果被驱动表是通过主键或者不允许存储 NULL 值的唯一二级索引等值匹配的方式进行访问的,那么被驱动表就是 eq_ref 。

    1.7K10

    MySQL索引与SQL语句优化

    概念 1.普通索引:最基本的索引,它没有任何限制 2.唯一索引:索引列的值必须唯一,且不能为空,如果是组合索引,则列值的组合必须唯一。...索引最多用于一个范围列,如果查询条件中有两个范围列则无法全用到索引。范围条件有:、>=、between等。 9、把计算放到业务层而不是数据库层。   ...更新会变更B+树,更新频繁的字段建立索引会大大降低数据库性能。   “性别”这种区分度不太大的属性,建立索引是没有什么意义的,不能有效过滤数据,性能与全表扫描类似。   ...13、建立索引的列不能为null,使用not null约束及默认值 14、利用延迟关联或者子查询优化超多分页场景, MySQL并不是跳过offset行,而是取offset+N行,然后放弃前offset...18、Select语句务必指明字段名称 19、如果排序字段没有用到索引,就尽量少排序 20、尽量用union all 代替 union。

    2.3K10

    MySQL大表增加唯一索引场景

    但MySQL中对于字段、索引的使用,就需要些技巧,否则就会碰到坑,这是初学MySQL,比较不太适应的一个点,看到技术社区推的这篇文章《技术分享 | MySQL 大表添加唯一索引的总结》,就讲到了MySQL...一、前言 在数据库的运维工作中经常会遇到业务的改表需求,这可能是 DBA 比较头疼的需求,其中添加唯一索引可能又是最头疼的需求之一了。...MySQL 5.6 开始支持 Online DDL ,添加[唯一]索引虽然不需要重建表,也不阻塞 DML ,但是大表场景下还是不会直接使用 Alter Table 进行添加,而是使用第三方工具进行操作,...本文就来总结梳理一下添加唯一索引的相关内容。 本文对 ONLINE DDL 讨论的也是基于 MySQL 5.6 及以后的版本。...binlog语句 映射的SQL语句 INSERT REPLACE INTO UPDATE UPDATE DELETE DELETE 由此可见,这个方式也不会校验数据的重复值,遇到重复的数据后,如果是同步全量数据就直接忽略

    4.4K40

    MySQL案例:insert死锁与唯一索引

    背景死锁是每个 MySQL DBA 都经常会遇到的问题,之前也写过关于死锁的详细解析。多数时候死锁容易在 update 中发生,且一般是涉及到二级索引。...问题描述细节信息已脱敏,死锁信息来自于搭建的测试环境,使用的是腾讯云数据库 MySQL,版本为 5.7.18-txsql-log 20211031。...-----------+------------+------------+-----------+----------+--------------+可以发现 Session 1 的 insert 语句对唯一索引的...仔细观察唯一索引的数据,可以看到 Session 1 插入的数据(abc-125-sz)在逻辑分布上与abc-130-sz是相邻的,通过多次尝试,可以确认这个 insert 语句不仅在当前插入的数据上加了锁...而解决方案在技术上并不复杂,只需要把发生死锁的唯一索引替换成普通索引就可以了,但是要注意这种替换操作对业务的影响。

    5.1K92

    深入理解四种数据库索引类型(- 唯一索引非唯一索引 - 主键索引(主索引) - 聚集索引非聚集索引 - 组合索引)唯一索引非唯一索引主键索引(主索引)聚集索引非聚集索引5.组合索引(联合索引)

    唯一索引/非唯一索引 主键索引(主索引) 聚集索引/非聚集索引 组合索引 唯一索引/非唯一索引 唯一索引 1.唯一索引是在表上一个或者多个字段组合建立的索引,这个或者这些字段的值组合起来在表中不可以重复...非唯一索引 2.非唯一索引是在表上一个或者多个字段组合建立的索引,这个或者这些字段的值组合起来在表中可以重复,不要求唯一。 主键索引(主索引) 3.主键索引(主索引)是唯一索引的特定类型。...表中创建主键时自动创建的索引 。一个表只能建立一个主索引。 聚集索引/非聚集索引 4.聚集索引(聚簇索引),表中记录的物理顺序与键值的索引顺序相同。一个表只能有一个聚集索引。...扩展:聚集索引和非聚集索引的区别?分别在什么情况下使用? 聚集索引和非聚集索引的根本区别是表中记录的物理顺序和索引的排列顺序是否一致。...也就是说行的位置会随着数据库里数据的修改而发生变化, 使用聚簇索引就可以保证不管这个主键 B+树的节点如何变化, 辅助索引树都不受影响。

    14.7K20

    你确定分得清MySQL普通索引和唯一索引?

    (一般设置学号字段为主键) 主键和唯一索引 主键保证数据库里面的每一行都是唯一的,比如身份证,学号等,在表中要求唯一,不重复。唯一索引的作用跟主键的作用一样。...需要区分该记录要更新的目标页是否在内存: 5.1 在内存 唯一索引 找到3和5之间位置,判断到没有冲突,插入值,语句执行结束。 普通索引 找到3和5之间位置,插入值,语句执行结束。...普通索引和唯一索引对更新语句性能影响的差别,只是一个判断,耗费微小CPU时间。 5.2 不在内存 唯一索引 需将数据页读入内存,判断到没有冲突,插入值,语句执行结束。...普通索引 将更新记录在change buffer,语句执行结束。 将数据从磁盘读入内存涉及随机IO访问,是数据库里面成本最高操作之一。...如果业务不能保证,或者业务就是要求数据库来做约束,那么没得选,必须创建唯一索引。这种情况下,本文意义在于,如果碰上大量插入数据慢、内存命中率低时,多提供一个排查思路。

    4.1K10

    MySQL实战之普通索引和唯一索引,应该怎么选择?

    3.更新过程为了说明普通索引和唯一索引对更新语句性能的影响这个问题,我需要先跟你介绍一下change buffer。...在数据库正常关闭的过程中,也会执行merge操作。显然,如果能够将更新操作先记录在change buffer,减少读磁盘,语句的执行速度会得到明显的提升。...这是,InnoDB的处理流程如下:对于唯一索引来说,找到3和5之间的位置,判断到没有冲突,插入这个值,语句执行结束对于普通索引来说,找到3和5之间的位置,插入这个值,语句执行结束这样看来,普通索引和唯一索引对更新语句性能影响的差别...这时,InnoDB的处理流程如下:对于唯一索引,需要将数据页读入内存,判断有没有冲突,插入这个值,语句执行结束对于普通索引来说,则是将更新记录在change buffer,语句执行结束将数据从磁盘读入内存涉及随机...IO的访问,是数据库里面成本最高的操作之一。

    2.3K01

    MySQL普通索引和唯一索引到底什么区别?

    1 概念区分 普通索引 V.S 唯一索引 普通索引可重复,唯一索引和主键一样不能重复。...处理之后的读请求 select * from t where k in (k1, k2); 读语句紧随更新语句,内存中的数据都还在,所以此时这俩读操作就与系统表空间和 redo log 无关。...到底何时使用唯一索引 问题在于“业务可能无法确保”。本文前提是“业务代码已经保证不会写入重复数据”,才讨论性能问题。 如果业务不能保证或业务就是要求数据库来做约束 没得选,必须创建唯一索引。...这样,索引a上的数据其实有两份。 不对啊,主键上的数据也不能删,那没有使用force index的语句,使用explain命令看到的扫描行数为什么还是100000左右?...参考 https://dev.mysql.com/doc/refman/8.0/en/innodb-change-buffer.html

    1.1K10

    你分得清MySQL普通索引和唯一索引了吗?

    (一般设置学号字段为主键) 主键和唯一索引 主键保证数据库里面的每一行都是唯一的,比如身份证,学号等,在表中要求唯一,不重复。唯一索引的作用跟主键的作用一样。...分情况讨论该记录要更新的目标页是否在内存中: 在内存 唯一索引 找到3和5之间位置,判断到没有冲突,插入值,语句执行结束。 普通索引 找到3和5之间位置,插入值,语句执行结束。...普通索引和唯一索引对更新语句性能影响的差别,只是一个判断,只会耗费微小CPU时间。...不在内存 唯一索引 需要将数据页读入内存,判断到没有冲突,插入值,语句执行结束 普通索引 将更新记录在change buffer,语句执行结束 将数据从磁盘读入内存涉及随机IO访问,是数据库里面成本最高操作之一...如果业务不能保证,或者业务就是要求数据库来做约束,那么没得选,必须创建唯一索引。这种情况下,本文意义在于,如果碰上大量插入数据慢、内存命中率低时,多提供一个排查思路。

    2.7K11
    领券