首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

MySQL 慢查询、 索引、 事务隔离级别

EXPLAIN M y S Q L 提 供 了 E X P L A I N 命 令 , 可 对 慢 查 询 ( S E L E C T ) 进 分 析 , 并 输 出 S E L E C T...我 们 可 针 对 输 出 的 信 息 对 慢 查 询 语 句 进 合 理 的 优 化 。...这样的查询应该是需要避免 的,CPU 消耗很高。...尽量选择区分度高的列作为索引,区分度的公式是 count(distinct col)/count(*),表示字段不重复的比例,比例越大我们 扫描的记录数越少,唯一键的区分度是 1,而一些状态、性别字段可能在大数据面前区分度就是...  不可重复读(Non-repeatableread): 在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新 的原有的数据。

2.8K50

IGNORE,REPLACE,ON DUPLICATE KEY UPDATE在避免重复插入记录时存在的问题及最佳实践

参考博客1中介绍了三种在MySQL中避免重复插入记录的方法,本文将在简单介绍这三种用法的基础上,深入分析这其各自存在的问题,最后给出在实际生产环境中对该业务场景的最佳实践。...此锁定通常保持到语句执行结束(并非有某些博客中说的保持到事务结束),确保为给定的INSERT语句序列可预测和可重复的顺序分配自动递增值,并确保自动递增由任何给定语句分配的值是连续的。...这里返回影响了2记录,原因是replace是先删除了原有的重复记录,再插入一条新记录。...; 当因为对于主键或唯一关键字出现重复关键字错误而造成插入失败时,从表中删除含有重复关键字值的(所有)冲突 ; 再次尝试把新插入到表中 。...同样的,auto_increment也发生了递增: 3.2 实现机制 其实现运行步骤如下: 尝试把新插入到表中 ; 当因为对于主键或唯一关键字出现重复关键字错误而造成插入失败时,则对现有的加上S

1.7K11
您找到你想要的搜索结果了吗?
是的
没有找到

【数据库】

数据库事务的四大特性 事务隔离级别以及各级别下的并发访问问题 数据丢失 脏读 不可重复读 InnoDB可重复读隔离级别~下如何避免幻读 当前读,快照读 场景模拟:快照读,2rc2rr RC、RR级别下的...索引 为什么使用索引 快速查询,避免全表扫描(全表扫描适用数据量小的情况) 像字典 什么样信息能成为索引 主键、唯一键、普通键 等 索引的数据结构 ?...和git的冲突很像 InnoDB可重复读隔离级别~下如何避免幻读 rr(可重复读级)别下是如何避免幻读的 为什么只实现伪MVCC,因为没有实现多版本共存,undoLog只是串行化的后果 ?...rc,ru无法避免幻读的原因 什么时候存在:rr,Serializable序列化,避免幻读 对主键索引或唯一键索引会用Gap锁吗 rr下gap锁出现的场景 ?...无法插入7【证明间隙锁存在】 ? 成功插入有边界12 ? 跟所对应主键有关 ? ? 主键的排序是在6——11的范围内的,所以被锁住 ?

60410

一篇文章彻底搞懂Mysql事务相关原理

插入意图锁定是一种通过INSERT插入之前的操作设置的间隙锁定 。...否则, InnoDB无法丢弃更新撤消日志中的数据,并且回滚段可能会变得太大,从而填满了您的表空间。 回滚段中撤消日志记录的物理大小通常小于相应的插入或更新的。...如果您大约相同的速率在表中较小的批次插入和删除,则由于所有“ 死 ”,清除线程可能会开始滞后并且表可能会变得越来越大 ,从而使所有内容都受磁盘约束慢。...这种级别下可以避免,脏读,不可重复读等查询问题。mysql 有两种机制可以达到这种隔离级别的效果,分别是采用读写锁以及MVCC。 采用读写锁实现: 为什么能可重复度?...但是,如果由于错误而仅回滚单个SQL语句,则可以保留该语句设置的某些锁。发生这种情况是因为InnoDB 某种格式存储锁,使得以后无法知道哪个语句设置了哪个锁。

77910

MySQL并发控制:锁机制

3.可重复读(repetable-read):MySQL默认隔离级别,在一个事务中,直到事务结束前,都可以反复读取到事务刚开始时看到的数据,并一直不会发生变化,避免了脏读、不可重复读现象,但是它还是无法解决幻读问题...MyISAM存储引擎支持并发插入减少给定表的读和写操作之间的争用: 如果MyISAM表在数据文件中间没有空闲块,则始终插入数据文件的末尾。...插入行之前,会设置一种插入意向锁,插入意向锁表示插入的意图。如果其它事务在要插入的位置上设置了X锁,则无法获取插入意向锁,插入操作也因此阻塞。 INSERT在插入设置X锁。...事务二和事务三在插入之前判断到了唯一键冲突,是因为插入前的重复索引检查,这次检查必须进行一次当前读,于是非唯一索引就会被加上S模式的next-key锁,唯一索引就被加上了S模式的Record锁。...避免影响其它事务。 尽量用相等条件访问数据,这样可以避免间隙锁对并发插入的影响 6、避免使用唯一键值约束:   总结:尽管通过上面介绍和sql 优化等措施,可以大大减少死锁,但死锁很难完全避免

2K20

MySQL间隙锁(幻读解决原理)

查看表结构,id、age、name都有索引 场景1:用不可重复的主键id测试间隙锁 范围查询 事务2的select操作只给三数据加了共享锁,为什么插入id为24的数据也不行呢?...20,id=24)自然无法插入 也就是说,如果我们指定age=20,id合法且<12,则可插入 很显然,事务1插入的age=18和age=19都不在事务2上锁的范围,所以可以插入 如果只是在辅助索引树上查找...没有加行锁,只能加表锁(这时加的是共享锁),所以事务1无论插入什么数据都不行 果然,没有用到索引 age>20用到了索引,所以可以用锁 三、测试等值间隙锁 查看表结构和表数据 设置成手动提交,设置串行化隔离级别...由于id=9的数据已经存在,主键和唯一键是不能重复的,事务2进行等值查询时,事务1插入一个新的数据,不用担心这条新插入的数据和查询条件是一样的,如果主键一样,SQL语句执行失败,所以肯定能成功 2....和gap-lock(防止别的事务插入索引值重复的数据,造成幻读) 对于主键索引,或者唯一键索引,值不允许重复,那只需要加行锁就够了,不需要再加间隙锁(对于唯一键索引,不可能发生插入索引值重复的数据) 串行化隔离级别通过排它锁和共享锁解决脏读

72420

故障分析 | MySQL:唯一键约束失效

最终得到的结论是:mysqlshell importTable() 导入数据时会做 SET unique_checks=0 操作,在满足一定条件时会导致唯一键约束失效,主库插入重复的数据,但从库会插入失败从而报错...当执行 DML 时,数据不在内存中,为了保证唯一性,必须先从磁盘读取数据,这个随机 IO 是无法避免的,change buffer 失去了其作用,因此对唯一索引无效。...(你需要自己确保数据不包含重复值)。这会让唯一键约束失效吗?...-+ 4 rows in set (0.01 sec) 如果想观察的更清楚,可以持续运行 sysbench run,用 sbtest* 表把 innodb buffer pool 占满,这样可以反复插入同一数据...一些干扰验证的现象 有些记录无法顺利插入进去,这个对我困扰非常大,一度让我以为推论是错误的...这个就留给官方解释吧: 如果是 char 类型的唯一键,则不会有类似问题: CREATE TABLE `

1.5K10

Web 开发 MYSQL 常用方法整理 (上)

一、数据插入篇 有唯一/主键(primary或者unique)存在时,避免重复插入的方法 在一些报名/拉票类型活动中, 往往需要对uin做唯一键处理,限制1个用户只能有1条报名记录。...为避免并发时重复数据的插入, 常用方法有3种: insert ignore into replace into on duplicate key update 假设有表如下: (1)使用 insert...假设原数据库已有数据: 执行insert ignore重复插入,提示插入了0(表示忽略此次操作): 执行insert ignore插入,无主键重复,则正常插入: (2)使用 replace...,若当前行存在唯一键冲突,则引用当前行insert时的num列来更新num字段,无重复存在的记录则正常插入。...而uin为333333的没有主键重复,所以是新增插入, 影响行数是1。 故,总影响行数是3

1.9K00

kutools for ms office 工具推荐

Kutools有效地帮助您处理Word文档处理复杂和重复的操作,并通过提高工作效率节省您的时间软件特色1、提供许多一键功能来完成那些重复、耗时的操作,例如一键删除所有空白一键删除所有图片和一键删除表格空白等等...2、提供更好的服务为目标,集合了许多 Word 自身无法实现或者难以实现的功能,例如在窗格中罗列所有超链接和书签以方便对它们进行管理和编辑、可对图片和表格等对象批量插入题注以及轻松重命名当前文档等等。...插入功能组能快速在文档中插入图文框、复选框、图片等。清除功能组一键删除完档中的多个分隔符、图片、文本框、书签等。表格功能组快速选取表格、插入斜线表头等功能提高用户对表格的操作效率。...书签功能组轻松插入、管理书签,一键实现隐藏或者显示书签标志并支持对书签进行批量删除。 ? kutools for Microsoft Excel ?...只能在 Excel 里进行激活,不可以在 Kutools 设置中心激活) 获取资源下载地址 关注并回复“word”获取下载地址

2.2K20

走近STL - map,只愿一键对一值

pair的第一元素被视为键值,第二元素被视为实值 map中所有键值都不能重复 map每个键值只对应一个实值 称之为:一键对一值啊。...初始化 #include #include using namespace std; map maptest; //string为键值,...int为实值 增 //插入方法多种多样,这里提几个基本的,万变不离其中 maptest.insert(pair('a', 100)); //单值插入 map<char,...//不过不好意思,这个是VC11才开始支持的哦 新增元素还有几个小问题,如何判断是否插入成功?如果对一键重复插入又会如何?如果只插入键不插入值会怎样呢?··· //首先,是不允许只插入一半的。...//然后,如果重复插入,则第一次之后的插入都会返回插入失败。 //那么如何判断插入成功?

57220

MySQL表的约束

所谓约束,就是避免犯一些低级错误,比如类似于语法错误,编译器的编译失败实际上也算是一种约束。 表中一定要有各种约束,通过约束,让我们未来插入数据库表中的数据是符合预期的。...,代表No的两必须插入有效数据,否则就无法插入。...将其设置为主键,就不用继续管它,插入数据时它本身会为了防止重复而自增+1。...因此,在建表时,我们也可以手动设置这个值: 通过last_insert_id函数,可以获取上一次的AUTO_INCREMENT的值: select last_insert_id(); 七.唯一键一键...在插入数据中,telephone作为业务上的数据,不能出现重复,一旦插入出现纰漏,将相同的telephone的数据给了不同的id,那么就造成了无法精准确定个人信息的情况,为了避免这种情况的发生,就需要将

18750

mysql 唯一索引_mysql主键和唯一索引的区别

我们将用户id及商品id列设置成唯一索引。那么就可以避免一个用户出现重复购买的情况。...4:建立主键的目的是让外键来引用. 5: 一个表最多只有一个主键,但可以有很多唯一键 四:存在唯一键冲突时,避免策略 1:使用insert ignore语句 insert ignore会忽略数据库中已经存在的数据...UNIQUE索引或PRIMARY KEY中出现重复值,则在出现重复值的执行UPDATE;如果不会导致重复的问题,则插入,跟普通的insert into一样。...4:总结 这三种方法都能避免主键或者唯一索引重复导致的插入失败问题。...replace into和insert … on duplicate key update,都是替换原有的重复数据,区别在于replace into是删除原有的后,在插入,如有自增id,这个会造成自增

2.7K30

InnoDB的锁机制深入理解

InnoDB使用next-key锁对索引进行扫描和搜索,这样就读取不到幻象避免了幻读的发生。...,事务内无法获取其他事务未提交的变更,但是由于能够读到已经提交的事务,因此会出现幻读和不重复读。...插入行之前,会设置一种插入意向锁,插入意向锁表示插入的意图。如果其它事务在要插入的位置上设置了X锁,则无法获取插入意向锁,插入操作也因此阻塞。 INSERT在插入设置X锁。...死锁产生的原因是事务一插入记录时,对(2,2)记录加X锁,此时事务二和事务三插入数据时检测到了重复键错误,此时事务二和事务三要在这条索引记录上设置S锁,由于X锁的存在,S锁的获取被阻塞。...事务二和事务三在插入之前判断到了唯一键冲突,是因为插入前的重复索引检查,这次检查必须进行一次当前读,于是非唯一索引就会被加上S模式的next-key锁,唯一索引就被加上了S模式的Record锁。

52510

《数据仓库工具箱》- 第三章零售业务中的知识点汇总

事务类型事实表 事物类型事实表通常一个事务一,或者一个事务线一。标示的是一个事务事件,比较稀疏,但是他的数量无法预测,可能会非常庞大。事务事实表返回的指标/度量通常是可加的。...维度属性,包括指标,数字化描述符和多层次 1.扁平化多对一层次 在维度建模中,不需要将重复的值分解到另一个规范化的表中节省空间。因为对比针对事实表的空间需求来说,维度表空间需求要简单的多。...正确的设计应该是在对应维度表中包括一表示该维度不可用于度量。...如果新维度属性只在某些中可以,那么在其他应该插入不可用或类似的描述符。 * 新维度 * * 可在事实表上添加新维度,在事实表中添加新的外键列并将新维度的主键填写到该外键列上。...代理键 代理键简单的自增的整数表示。代理建的作用仅仅就是连接事实表和维度表。数据仓库中事实表和维度表的连接应该尽可能的使用无意义的代理建。应该避免使用自然键作为维度表的主键。

88720

《hive编程指南》读书笔记:模式设计

但是非标准化数据可能导致数据重复,而且有更大的导致数据不一致的风险。...但是,要将数据正确的插入到表的过程完全取决于用户自己! 怎么使用分桶插入数据?...(1)为分桶设置正确的reducer个数 set hive.enforce.bucketing = true; (2)插入数据 from raw_logs insert overwrite table...(3)分桶有利于执行高效的map-side join 七、为表增加列 为表增加字段,例子: alter table weblogs add columns (user_id string); 这种方式无法再已有字段的开始或者中间增加新字段...八、使用列存储表 hive通常使用式存储,不过hive也提供了一个列式SerDe来混合列式格式存储信息。某些数据集使用列式存储是最优的,如某些列重复数据特别多时,使用列式存储会加快查询速度。

34210

面试官:MySQL 唯一索引为什么会导致死锁?

(4) 建立主键的目的是让外键来引用. (5) 一个表最多只有一个主键,但可以有很多唯一键 存在唯一键冲突时,避免策略 insert ignore insert ignore会忽略数据库中已经存在的数据...UNIQUE索引或PRIMARY KEY中出现重复值,则在出现重复值的执行UPDATE;如果不会导致重复的问题,则插入,跟普通的insert into一样。...死锁 insert … on duplicate key 在执行时,innodb引擎会先判断插入是否产生重复key错误,如果存在,在对该现有的加上S(共享锁)锁,如果返回该行数据给mysql,然后...结论: 这三种方法都能避免主键或者唯一索引重复导致的插入失败问题。...参考 Mysql中unique与primary约束的区别分析(转) MySQL避免插入重复记录:唯一性约束 MySQL优化–INSERT ON DUPLICATE UPDATE死锁 ---- 我是蜗牛

1.4K20

MySQL避免插入重复记录的方法

mysql在存在主键冲突或者唯一键冲突的情况下,根据插入策略不同,一般有以下三种避免方法。...KEY中出现重复值,则在出现重复值的执行UPDATE;如果不会导致重复的问题,则插入,跟普通的insert into一样。...使用insert into,你必须具有insert和update权限 如果有新记录被插入,则受影响的值显示1;如果原有的记录被更新,则受影响的值显示2;如果记录被更新前后值是一样的,则受影响行数的值显示...结论: 这三种方法都能避免主键或者唯一索引重复导致的插入失败问题。 insert ignore能忽略重复数据,只插入重复的数据。...replace into和insert ... on duplicate key update,都是替换原有的重复数据,区别在于replace into是删除原有的后,在插入,如有自增id,这个会造成自增

2.2K51

MySQL主键自增值为什么有“空洞”?

最终发现了MySQL主键自增值“空洞”了 1.场景准备 测试场景为MySQL 8.0: 主键重复场景 唯一键重复场景 1、建表,包含主键及唯一约束 CREATE TABLE t1( id int(...insert into t1 values (1,'aaa', 111); ERROR 1062 (23000): Duplicate entry '1' for key 't1.PRIMARY' # 测试唯一键重复...而使用insert ignore的方式进行数据插入,则会忽略插入错误的继续插入没有问题的记录,最终warning进行提示。...,然后主键冲突,就对该主键的内容进行替换,如果唯一键冲突,唯一值所在行就会删除,重新插入新的,如果都不冲突则正常插入数据。...可是理解了这个并不能马上理解现在的这个问题,我们知道当数据进行数据插入的时候,如果插入的数据中自增列不指定其值的时候,该列就会当前自增值作为其值,如果指定其值就会插入指定的值,当然也有满足唯一的原则,

2.2K20

InnoDB的锁(Locking)

如果锁定请求与现有锁发生冲突,并且由于会导致死锁而无法被授予许可 ,则会发生错误。 意向锁除全表请求以外(例如:LOCK TABLES ... WRITE)不会阻塞任何表或。...下一键锁 下一键锁是索引记录上的记录锁定和索引记录之前的间隙上的间隙锁定的组合。 InnoDB执行行级锁定的方式是,当它搜索或扫描表索引时,会在遇到的索引记录上设置共享或互斥锁。...最高不是真正的索引记录,因此,实际上,此下一键锁定仅锁定跟随最大索引值的间隙。 默认情况下,InnoDB REPEATABLE READ事务隔离级别运行。...插入意图锁是一种通过INSERT插入之前的操作设置的间隙锁 。...甲SPATIAL索引包含最小外接矩形(MBR)值,因此, InnoDB通过设置用于查询的MBR值的谓词锁强制上的索引一致的读取。其他事务不能插入或修改将匹配查询条件的

91930
领券