1. 事务隔离级别
事物隔离级别 | 缺点 |
---|---|
Read-Uncommitted | 脏读 |
Read-Committed | 不开重复读 |
Repeatable-Read | 幻读 |
Serializable | 并发低 |
-
MySQL默认Repeatable-Read
- 生产中遇到的bug
sql = """ SELECT user_id, say_content FROM `say_log` WHERE add_time > %s """ while True: # 取最近30min记录 pre_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time() - 30*60)) items = conn.execute(sql, pre_time ).fetchall() ......
- bug原因已经解决方案
# mysql事物隔离级别默认为Repeatable-Read, # 事物的状态维持在第一次执行失数据库状态, # 导致后续时间新增内容无法读取 while True: pre_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time() - 30*60)) items = conn.execute(sql, pre_time ).fetchall() conn.commit() # 每次提交事务,解决bug
- 修改事物隔离级别SQL语句:
SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}
2. 锁机制
- 表锁(MyISAM默认锁)
- 不会死锁
- 并发效率低
- 行锁(InnoDB默认锁)
- 会导致死锁
- 并发效率高
- 锁类型
锁 | X (排他锁) | S (共享锁) | IX (意向排他锁) | IS(意向共享锁) |
---|---|---|---|---|
X | n | n | n | n |
S | n | y | n | y |
IX | n | n | y | y |
IS | n | y | y | y |
(y表示兼容,n表示不兼容)
-- 实例
set autocommit=0;
begin;
select xx from t for update; 加上排他锁
select xx from t lock in share mode; 加上共享锁
commit;
3. 索引
-
索引数据结构
-- mysql的InnoDB默认使用B+tree索引
-- 在常用字段上会,内部优化自动建立hash索引(hash索引只适合等值连接) -
类型
-
单列索引
-- 唯一索引,值唯一,可以存在null
-- 普通索引,值可重复 -
组合索引
-- (a, b, c) 匹配a、ab、abc 遵循从左往右原则 -
全文索引
-- 仅MyISAM支持,且用于英文(用于词语模糊查找,不太实用) -
注意点
-- 在查询远大于插入(更新或删除)的表上建立索引
-- 索引应加在低重复率的字段上
-- 对索引值运用函数,导致索引失效
-- (not)in(not)exist,导致索引失效
-
网友评论