mysqlinsert
Mysql锁简介
名词们:
- 读写锁, select xx for share/update
- 意向锁, 是一种表锁, 意思是表内有行级的读写锁了, 再对表加锁就不用遍历每一行了
- 间隙锁, 是当前读(读最新值)模式下, 解决幻读问题引入的锁, 不让新事务插入新的数据
如何解决幻读?
- 快照读, 通过MVCC解决了幻读问题
- 当前读, 间隙锁
加/解锁时机?
该加的时候加, 提交之后统一回收
对于innodb引擎, 有个概念, 一级索引(聚簇索引)和二级索引
哪些条件影响加锁行为?
- 隔离级别
- 查询条件是否有索引? 几级索引? 是否唯一索引?
- SQL执行计划, 是全表扫描还是索引扫描?
加锁的顺序? (一级索引/二级索引)
- 根据查找顺序, 先找出来的先加锁
列没有索引的话, 要先锁全表.
如何解释全表扫描要先都加锁?
- 有个前提, 事务什么时候才算开始? -- 第一条加锁语句
- 那么在全表扫描的时候, 如果已经发现一条匹配记录, 会执行加锁, 同时意味着事务开始, 但是仍然会往后扫描. 此时后面满足条件的记录可能被其他事务搞脏. 所以要先加表锁.
- 如果是索引扫描, 情况会好一点, 毕竟数据都存储在一起, 可以做到同时锁上所有满足要求的数据
:) 可以理解为能同时锁上所有满足条件的数据
可重复读 和 读已提交 的实现技术区别是?
- 可重复读要解决幻读, 会用到gap锁
为什么主键和唯一索引不需要gap锁, 其他索引需要加gap锁?
- 间隙锁就是为了解决新增, 而 主键/唯一索引本身已经防止新增了
#读书笔记#
程序员面试题:MySQL数据库建表为什么不推荐使用uuid作为主键?我们首先分享一下使用主键自增的利弊。
自增的主键的值是顺序的,存储空间是提前分配的,所以Innodb把每一条记录都存储在一条记录的后面。 当增长到最大因子时,会自动扩容。
1、当新的一条数据写入时,数据就会按照顺序的方式加载,主键会顺序填满记录,提升了页面的最大填充率,不会有空间的浪费。
2、新写入的数据一定会在原本最大数据行下一行,数据库引擎能快速定位和寻址,不会为计算新行的位置而做出额外的消耗时间。
3、减少了空间分裂和碎片的产生 ,节约存储空间,让数据更紧凑。
那么,为什么不推荐使用UUID作为主键呢?欢迎大家交流分享。
#IT# #Java面试题# #MySQL# #数据库#
一天一题
面试岗位:java全栈工程师
问:说一说mysql的锁都有哪一些?(五)
答:
间隙锁:
官方文档描述:Gap Lock的唯一目的就是阻止其他事务插入到间隙中。Gap Lock可以同时存在,不同的事务可以同时获取相同的Gap Lock,并不会互相冲突。Gap Lock也是可以显示的被禁止的,只要将事务的隔离级别降低到 READ COMMITTED。
对于间隙锁,什么叫锁住不存在的空闲空间,举个例子:
一个表有id为1,2,3,5,6,9行数据,执行如下sql语句
select * from people where id > 3 AND id <7 for update; 这是一个范围检索,InnoDB不仅会锁住id为5和6两行的数据,也会锁住id为4(虽然该行并不存在)的纪录。
InnoDB使用间隙锁的目的:防止幻读,对于锁住的范围,新插入的数据会被阻塞。
作为开发人员而不是 DBA,我应该了解 MySQL 的哪些方面?
MySQL 的优点之一是整体架构和用法相当简单。这意味着开发人员和 DBA 之间没有太大区别,只是 DBA 负责备份和整体系统管理(缓冲池和日志文件有多大等),这两个角色最终都会创建表和调整查询。
因为查询调优是作为开发人员或 DBA 的一个重要方面,所以这两个角色都必须熟悉 MySQL 优化器(它非常简单,因此这些知识可以很容易地转移)以及它如何选择和使用索引。 MySQL 缺少其他数据库拥有的一些技术,例如“索引跳过扫描”,因此了解为什么选择某些索引(以及何时仅使用索引的子集)非常重要。
例如,给定 (A,B) 上的索引,只有 A 部分可用于以下查询,因为它在 A 上使用范围访问:
select *
from T
where A between 1 and 10
and B between 1 and 5;
但是这种访问可以使用两个部分:
select *
from T
where A = 15
and B between 1 and 5;
所以有一个隐含的规则,范围在索引的右边。一个更典型的例子是索引一个日期字段和一些其他字段,即使另一个字段的基数高于日期字段,将日期字段放在右边也是有意义的,因为它几乎总是与范围条件一起使用.
除了了解何时使用索引(EXPLAIN 是您的朋友)之外,了解各种存储引擎的性能特征也很重要。您几乎总是使用 InnoDB(自 5.5 以来的默认设置)并且它使用 INDEX ORGANIZED TABLES。这意味着主键非常重要。保持简短并按主键按排序顺序插入以获得最佳性能。





