高性能mysql精要

1、explain 中 extra (using index ) 表示覆蓋索引,sql優(yōu)化中最好能使用覆蓋索引,否則(二級索引)需要回表查詢。所謂覆蓋索引,是指要查詢的列正好是索引,而條件也是這個索引之一
2、where 語句中 條件等于主鍵的 ,在內(nèi)核索引層完成,條件等于非索引的,在服務(wù)層完成
3、讀索引加共享鎖,讀主鍵加排他鎖
4、當有連接表而其中一條語句中有含有where = 主鍵的,優(yōu)化器會優(yōu)先執(zhí)行這條語句,從而減少查詢的數(shù)量
5、最左前綴原則,即 a,b,c為組合索引 ,語句 where a='A' and b='B' and c>'C' 可以使用索引,順序可以打亂,如 where b='B' and c>'C' and a='A' 。而where b='B' and a>'A' and c='C' 無法使用索引,因為 a>'A' 這里使用了大于號不滿足最左前綴原則
6、 %like% 無法使用索引,而like%可以
7、索引采用b+樹的原因:①b+樹樹高小于二叉樹,b+樹每一層等于物理內(nèi)存中的一頁,每次io都把所有數(shù)據(jù)讀取出來,從而減少了訪問io的次數(shù)。②葉子節(jié)點是一個單鏈表,在使用范圍 between 、in等語句時速度很快
8、由于數(shù)據(jù)庫的邏輯結(jié)構(gòu)是根據(jù)索引排序,如果order by 不適用索引將會全表掃描,下面是一個order by 的優(yōu)化例子:
①select cols from profiles where sex ='M' ORDER BY rating LIMIT 10;
其中 sex ,rating 聯(lián)合索引
②使用覆蓋索引
SELECT cols from profiles INNER JOIN ( SELECT primary key cols from profiles where x.sex='M' ORDER BY rating LIMIT 10000,10) AS x using primary key cols
這里子句使用了覆蓋索引
9、分解關(guān)聯(lián)查詢
好處① 讓緩存的效率更高②減少鎖的競爭③查詢效率本身可能會提高④可以減少冗余記錄
10、mysql執(zhí)行的基礎(chǔ):①客戶端->②查詢緩存->③解析器->④解析樹->⑤預(yù)處理器->⑥查詢優(yōu)化器->⑦查詢執(zhí)行計劃->⑧查詢執(zhí)行引擎->⑨api接口調(diào)用存儲引擎->⑩數(shù)據(jù)->11結(jié)果返回
11、mysql在from 子句中遇到子查詢時,先執(zhí)行子查詢并將其結(jié)果放到一個臨時表中(臨時表時沒有任何索引的,在編寫復(fù)雜子查詢和關(guān)聯(lián)查詢的時候需要注意),然后將這個臨時表當一個普通表對待
12、mysql的執(zhí)行計劃是一顆左側(cè)深度優(yōu)先的樹
13、mysql 對where 條件中包含IN()的子查詢語句實現(xiàn)的很糟糕(但對IN()中包含列表則較好,特別是數(shù)據(jù)量大的時候)
14、Extra 字段顯示"using index for group-by"表示使用松散索引掃描
15、最大值最小值優(yōu)化:
select MIN(actor_id) from actor where first_name='PENELOPE' first_name無法使用索引,改寫為:
select actor_id from actor using index(primary) where first_name ='PENELOPE' limit 1;先使用主鍵索引,在服務(wù)層找到符合的后直接停止,因為主鍵本身就是排序好的
16、優(yōu)化count()
SELECT COUNT() FROM CITY WHERE ID >5 改寫 為:
select (select count(
)from city-count()) from city where id<=5 子句是常量,父句數(shù)量少
17、優(yōu)化關(guān)聯(lián)查詢:
①確保on 子句中的列上有索引,當表A和表B用c列關(guān)聯(lián)的時候,如果優(yōu)化器的關(guān)聯(lián)順序是B、A,那么就不需要在B表上對應(yīng)列上建索引(因為B表是使用全表掃描)
②確保任何的group by 和order by 中的表達式只涉及到一個表中的列
18、優(yōu)化子查詢:
盡可能轉(zhuǎn)換為關(guān)聯(lián)查詢(不是絕對的)
19、優(yōu)化group by:
如果需要對關(guān)聯(lián)查詢做分組,并且是按照查找表中的某個列進行分組,那么通常采用查詢表的標識列分組的效率會比其他的更高
select actor.first_name ,actor.last_name ,count(
) from film_actor inner join actor using(actor_id)
group by actor.first_name,actor.last_name 改寫為:
select actor.first_name ,actor.last_name ,count(*) from film_actor inner join actor using(actor_id)
group by actor.actor_id
20、mysql 可重復(fù)讀是如何實現(xiàn)的?
采用mvcc,是通過在每行記錄后面保存兩個隱藏的列來實現(xiàn)的,這兩個列,一個保存了行的創(chuàng)建時間,一個保存了行的過期時間。存儲的不是時間而是系統(tǒng)版本號。①只查找版本早于當前事務(wù)版本的數(shù)據(jù)行②行的過期版本要么未定義,要么大于當前事務(wù)版本號,這樣可以確保事務(wù)讀取到的行,在事務(wù)開始之前未過期

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容