1. 事務(wù)隔離級別
| 事物隔離級別 | 缺點(diǎn) |
|---|---|
| Read-Uncommitted | 臟讀 |
| Read-Committed | 不開重復(fù)讀 |
| Repeatable-Read | 幻讀 |
| Serializable | 并發(fā)低 |
-
MySQL默認(rèn)Repeatable-Read
- 生產(chǎn)中遇到的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原因已經(jīng)解決方案
# mysql事物隔離級別默認(rèn)為Repeatable-Read, # 事物的狀態(tài)維持在第一次執(zhí)行失數(shù)據(jù)庫狀態(tài), # 導(dǎo)致后續(xù)時(shí)間新增內(nèi)容無法讀取 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() # 每次提交事務(wù),解決bug- 修改事物隔離級別SQL語句:
SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}
2. 鎖機(jī)制
- 表鎖(MyISAM默認(rèn)鎖)
- 不會死鎖
- 并發(fā)效率低
- 行鎖(InnoDB默認(rèn)鎖)
- 會導(dǎo)致死鎖
- 并發(fā)效率高
- 鎖類型
| 鎖 | 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表示不兼容)
-- 實(shí)例
set autocommit=0;
begin;
select xx from t for update; 加上排他鎖
select xx from t lock in share mode; 加上共享鎖
commit;
3. 索引
索引數(shù)據(jù)結(jié)構(gòu)
-- mysql的InnoDB默認(rèn)使用B+tree索引
-- 在常用字段上會,內(nèi)部優(yōu)化自動(dòng)建立hash索引(hash索引只適合等值連接)-
類型
單列索引
-- 唯一索引,值唯一,可以存在null
-- 普通索引,值可重復(fù)組合索引
-- (a, b, c) 匹配a、ab、abc 遵循從左往右原則全文索引
-- 僅MyISAM支持,且用于英文(用于詞語模糊查找,不太實(shí)用)注意點(diǎn)
-- 在查詢遠(yuǎn)大于插入(更新或刪除)的表上建立索引
-- 索引應(yīng)加在低重復(fù)率的字段上
-- 對索引值運(yùn)用函數(shù),導(dǎo)致索引失效
-- (not)in(not)exist,導(dǎo)致索引失效