黑馬程序員 MySQL數(shù)據(jù)庫入門到精通,從mysql安裝到mysql高級、mys

存儲引擎
存儲引擎:基于表而非基于數(shù)據(jù)庫,存儲數(shù)據(jù),建立索引,更新/查詢等數(shù)據(jù)技術(shù)的實(shí)現(xiàn)方式。默認(rèn)InnoDB
InnoDB:兼顧高可用性和高性能的通用存儲引擎,
DML操作支持ACID特性:原子性,一致性,隔離性,持久性,支持行級鎖,支持外鍵
邏輯存儲結(jié)構(gòu):表空間,段,區(qū),頁,行
MyISAM:是早期默認(rèn)存儲引擎,
特點(diǎn):
不支持事務(wù),不支持外鍵
支持表鎖,不支持行鍵
與InnODB區(qū)別:
不支持事務(wù),
支持表鎖,不支持行鎖
不支持外鍵
索引基本概念
應(yīng)用場景:InnoDB:對事物完整性有比較高的要求
B+樹索引
Hash索引:哈希沖突,哈希碰撞,引入鏈表
支持引擎:Memory引擎
B+樹:非葉子結(jié)點(diǎn)不存放數(shù)據(jù),可以存儲更多key,且會形成雙向鏈表,便于排序
索引分類:
主鍵索引:默認(rèn)自動創(chuàng)建,只能有一個,關(guān)鍵字:primary
唯一索引: 可以有多個
explain:
type:all代表全表掃描
ref:非唯一索引
const:唯一索引
index:對索引進(jìn)行掃描,遍歷索引樹
索引使用
索引聯(lián)系了多列:聯(lián)合索引:
如果最左邊的字段不存在:全部失效
如果不連續(xù):部分失效
不要在索引列進(jìn)行運(yùn)算操作,否則運(yùn)算會失效
字符串字段不加單引號,索引失效
如果僅僅是尾部模糊匹配,索引不會失效,否則會失效。
or連接的條件
用or分隔開的條件,如果or前的條件中的列有索引,而后面的沒有索引,那么涉及到的索引都不會被用到
數(shù)據(jù)分布影響:走索引更慢則不走索引
范圍查詢:>不走索引,>=不走索引
SQL提示:在sql語句加入一些人為的提示
覆蓋索引:盡量使用覆蓋索引,不需要回表查詢數(shù)據(jù)。
前綴索引:用于處理較長的字符串或者文本
單列索引和聯(lián)合索引:設(shè)計多個查詢條件,一般使用聯(lián)合索引。聯(lián)合索引排序會先按照第一個字段排序,再按照第二個字段排序。
SQL優(yōu)化
insert插入優(yōu)化:批量插入,手動提交數(shù)據(jù),主鍵順序插入。
大批量插入數(shù)據(jù),使用MySQL數(shù)據(jù)庫提供的 load指令進(jìn)行插入
主鍵優(yōu)化
頁分裂:主鍵順序插入,亂序插入可能會引發(fā)頁分裂。
頁合并:當(dāng)頁中刪除的記錄達(dá)到某個閾值,InonoDB會開始尋找最靠近的頁看看是否可以將兩個頁合并以優(yōu)化空間使用。
order by 優(yōu)化:根據(jù)排序字段建立合適的索引,多字段索引,也遵循最左前綴法則
盡量使用覆蓋索引
多字段排序,需要注意聯(lián)合索引創(chuàng)建時的規(guī)則
如果不可避免出現(xiàn)filesort.可以適當(dāng)增大sort_buffer_size(默認(rèn)256)
count優(yōu)化:沒有很好的優(yōu)化策略
count(主鍵):會遍歷整張表,把每一行id值加起來,交給服務(wù)層直接累加,不需要判斷
count(*):不取值,直接累加
count(字段):取值判斷,然后再累加
count(1):和上一種性能差不多。
update語句:如果更新字段是索引字段,則會增加行鎖,否則會增加表鎖,降低并發(fā)性能。