mysql 查询设置事务隔离级别
查询mysql 5.7 1SELECT @@tx_isolation; mysql 8.0 1select @@transation_isolation; 设置设置 seesion 级别为可重复读1set session transaction ISOLATION level repeatable read; 设置系统级别为可重复读1set global transaction ISOLATION level repeatable read; 所有的隔离级别 read uncommitted : 读未提交 (可以读到未提交的数据 (脏读) ) read committed : 读已提交 — oracle 默认隔离级别 (可能每次读取的数据结果不一致 (幻读)) repeatable read : 可重复读 — mysql 默认隔离级别 ( innodb 采用 mvcc 解决幻读问题) serializable : 串行化 (类似锁,写数据必须等待另一个事务结束) 设置 事务不自动提交123set autocommit = 0 ;或者start...
InnoDB为什么要选择B+树来存储数据
关于InnoDB索引,我们可能知道InnDB索引是用B+树实现的,而B+树就是一种能优化查询速度的数据结构。但我们又没想过这样一个问题,能优化查询速度的数据结构有很多,为什么InnoDB要采用B+树? 常见优化查询速度数据结构哈希表哈希表是一种以键 - 值(key-value)存储数据的结构,我们只要输入待查找的键即 key,就可以找到其对应的值即 Value。哈希的思路很简单,把值放在数组里,用一个哈希函数把 key 换算成一个确定的位置,然后把 value 放在数组的这个位置。 不可避免地,多个 key 值经过哈希函数的换算,会出现同一个值的情况。处理这种情况的一种方法是,拉出一个链表。 假设现在维护着一个身份证信息和姓名的表,需要根据身份证号查找对应的名字,这时对应的哈希索引的示意图如下所示: 图中,User2 和 User4 根据身份证号算出来的值都是 N,但没关系,后面还跟了一个链表。假设,这时候你要查 ID_card_n2 对应的名字是什么,处理步骤就是:首先,将 ID_card_n2 通过哈希函数算出 N;然后,按顺序遍历,找到...
mvcc浅析
在讲Mvcc前,我觉得有必要先了解一下InnoDB的行锁。mysql从5.5.5开始使用InnoDB作为默认存储引擎,lock的对象是事务,用来锁定的是数据库中的对象,如表、页、行。并且一般lock的对象仅在事务commit或rollback后进行释放(不同事务隔离级别释放的时间可能不同)。InnoDB存储引擎实现了如下两种标准的行锁: 共享锁(S Lock)允许事务读一行数据 排他锁(X Lock)允许事务删除或更新一行数据 说明: 读锁、S锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这保证了其他事务可以读A,但在T释放A上S锁之前不能对A做任何修改。 写锁、X锁,若事务T对数据对象A加上X锁,事务T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T释放A上的锁,这保证了其他事务在T释放A上的锁之前不能再读取和修改A。 一致性非锁定读一致性的非锁定读(consistent nonlocking read )是指InnoDB通过行多版本控制(multi...
Mysql Explain工具使用及索引调优
使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈 在 select 语句之前增加 explain 关键字,MySQL 会在查询上设置一个标记,执行查询会返 回执行计划的信息,而不是执行这条SQL 注意:如果 from 中包含子查询,仍会执行该子查询,将结果放入临时表中 explain分析示例示例表: 12345678910111213141516171819202122232425262728CREATE TABLE `actor` ( `id` int(11) NOT NULL, `name` varchar(45) DEFAULT NULL, `update_time` datetime DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;INSERT INTO `actor`(`id`,`name`,`update_time`)VALUES(1,'a','2017‐12‐22 15:27:18'),...