MySQL
事务要素ACID:
- 原子性(atomicity):事务开始后,所有的操作要么做完要么都不做。如果出错就会回滚到事务开启前的状态。例如转账A扣钱失败,B就不会收到钱。
- 一致性(Consistency):事务提交后,要确保结果的一致性,例如转账不能A扣钱,B没收到钱。
- 隔离性(Isolation):事务开始后,同一时间只允许一个事务请求同一数据,修改的数据对其他事务是不可见的,避免不同事务之间相互干扰。比如A在取钱,B不能向这张卡转账。
- 持久性(Durability):事务完成后,事务对数据库的所有更新都被保存到数据库,不能回滚。
四种隔离级别:
- 未提交读(READ UNCOMMITTED):事务中的修改,即使没有提交,对其他事务也是可见的。相当于一个事务对数据的操作未完成,别的事务就能读到被修改的数据,这时回滚,那其他事务就读到脏数据。
- 不可重复读-提交读(READ):事务中读到的数据,可以被别的事务修改,再读一次可能就是不一样的值,也叫不可重复读。
- 默认-可重复读(REPEATEBLE READ):同一事务中,多次读取同一记录的结果是一致的,MySQL默认的隔离级别。未提交时,当前事务修改的数据,当前事务可见,其他事务不可见。但可能产生幻读,例如别的事务修改了数据并提交,当前事务是看不到的。因为读的是快照(历史版本),select不会更新版本号,insert、update、delete会更新版本号。
- SERIALIZABLE(可串行化):最高隔离级别,读取每一行数据都加上锁,可能导致大量的超时和锁争用问题,一般不使用。
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
读未提交(read-uncommitted) | 是 | 是 | 是 |
不可重复读(read-committed) | 否 | 是 | 是 |
可重复读(repeatable-read) | 否 | 否 | 是 |
串行化(serializable) | 否 | 否 | 否 |
#设置事务隔离级别为'read-committed' set @@global.tx_isolation='read-committed'; set @@session.tx_isolation='read-committed'; set @@tx_isolation='read-committed'; #查看事务隔离级别 SELECT @@global.tx_isolation; SELECT @@session.tx_isolation; SELECT @@tx_isolation;
索引
索引类型
普通索引 index:加速查找
主键索引 primary key:加速查找+约束(不为空且唯一)
唯一索引 unique:加速查找+约束(唯一)
联合索引:参考资料 https://www.cnblogs.com/softidea/p/5977860.html
- primary key(id,name):联合主键索引
- unique(id,name):联合唯一索引
- index(id,name):联合普通索引
全文索引 fulltext:用于搜索很长一篇文章的时候,效果最好
空间索引 spatial:不常用
索引方式
hash:单条查询快,范围查询慢
btree:b+树,层数越多,数据量指数级增长
SQL优化
慢查询记录配置项
可将耗时超过指定时间的sql记录到磁盘文件中,方便定位慢查询sql
#慢查询日志 SHOW VARIABLES LIKE "%slow_query_log%" SET GLOBAL slow_query_log=ON; #慢查询判定值 SHOW VARIABLES LIKE "%long_query_time%" SET GLOBAL long_query_time=2;
关键字EXPLAIN
参考资料https://www.cnblogs.com/leeego-123/p/11846613.html
可分析sql是否命中索引,查询范围,查询rows数。
分析sql如下:
type=ALL 连接类型
possible_keys=name_index,job_index 可使用的索引
key=null 命中的索引
rows=1800000 实际查询的行数
通过sql分析,发现sql进行了全表查询,检查表结构及数据发现job字段的值全部为'SALESMAN',所以这个字段并不适合做为索引。
添加一个deptno作为索引,不以or关键字连接job字段,命中索引不再全表查询。
参考资料:
https://www.jianshu.com/p/bf73c8d50dc2
https://blog.51cto.com/u_9291927/2083190
https://www.zhihu.com/question/20596402?sort=created
https://www.jianshu.com/p/2084216e81ce