事務(wù)
- a原子性,要么全部,成功不成功就全部回滾
- c一致性,事務(wù)執(zhí)行前與事務(wù)執(zhí)行后保持一致
- i隔離性,單獨(dú)事務(wù)數(shù)據(jù)不串,多個(gè)事務(wù)并發(fā)時(shí),每個(gè)事務(wù)隔離
- d持久性,事務(wù)成功被提交,就算遇見其他問題,事務(wù)處理的數(shù)據(jù),是永久有效的
事務(wù)隔離
- mysql事務(wù)的默認(rèn)隔離是重復(fù)讀
- 未提交讀-- 事務(wù) 還未完全提交成功,提交部分中止,就已經(jīng)讀到數(shù)據(jù),出現(xiàn)臟讀
- 提交讀-- 多個(gè)事務(wù)不能同時(shí)來,一個(gè)事務(wù)要等另一個(gè)事務(wù)完成提交后才能讀取數(shù)據(jù)
- 重復(fù)讀--事務(wù)在開啟讀取數(shù)據(jù)的時(shí)候,不能修改操作數(shù)據(jù)
- 系列化--是事務(wù)隔離的最高級(jí)別,事務(wù)串化性執(zhí)行數(shù)據(jù),可以避免臟讀,幻讀,重復(fù)讀,但是這種隔離效率低下,很耗數(shù)據(jù)庫(kù)性能,不推薦使用
事務(wù)并發(fā)可能遇見的問題
- 臟讀--一個(gè)事務(wù) 處理過程中讀取了另外一個(gè)未提交事務(wù)的數(shù)據(jù)
- 幻讀--一般是insert操作
- 不可重復(fù)讀--一般是update操作,事務(wù)讀的過程中被另外一個(gè)事務(wù)update
mysql引擎
myisam
不支持事務(wù),不支持外鍵,只支持表級(jí)鎖,優(yōu)點(diǎn)是查詢速度速度快,主要用于insert,select操作比較多的表
支持3種不同的存儲(chǔ)格式,分別是:靜態(tài)表;動(dòng)態(tài)表;壓縮表
innodb
支持事務(wù),支持行級(jí)鎖,行級(jí)鎖可大大提升并發(fā)時(shí)候事務(wù)處理的速度,提供了具有提交、回滾和崩潰恢復(fù)能力的事務(wù)安全,查詢速度慢
原博地址:https://github.com/xianyunyh/PHP-Interview/blob/master/Mysql/%E5%AD%98%E5%82%A8%E5%BC%95%E6%93%8E.md
數(shù)據(jù)庫(kù)優(yōu)化
-- 查詢sql優(yōu)化,少用子查詢,盡量join;少用like;分頁查詢limit;需要什么字段查什么字段,少用select *;拆分大的insert.delete;
-- 善用索引,在group by ,orderby,where, on這些字段建索引,加快查詢速度;在數(shù)據(jù)類型小的字段加索引;
-- 表結(jié)構(gòu)的數(shù)據(jù)類型選擇,多用not null,盡量避免null數(shù)據(jù);根據(jù)數(shù)據(jù)選擇最適用的數(shù)據(jù)類型;使用合理的定長(zhǎng)數(shù)據(jù)類型,固定長(zhǎng)度的會(huì)節(jié)約資源,查詢的時(shí)候快一點(diǎn),多使用char.enum,而不是varchar
-- 使用命令分析:explain分析sql,查看數(shù)據(jù)庫(kù)慢查詢速度 show status like 'slow_queries','connections','com_select','uptime',
-- 分庫(kù)分區(qū)分表,主從哭,讀寫分離
分表:垂直分表,針對(duì)表列數(shù)比較多的表,將常用與不常用的字段列分開,數(shù)據(jù)大的獨(dú)立出來
水平分表, 表結(jié)構(gòu)一致,可以通過加日期后綴來存儲(chǔ)不同時(shí)期的數(shù)據(jù),服務(wù)端使用數(shù)據(jù)的時(shí)候,通過當(dāng)前業(yè)務(wù)情況來操作使用那張表。也可以通過數(shù)據(jù)的不同類型分表,按板塊結(jié)構(gòu)分表