myisam的btree索引
frm結(jié)構(gòu)丈秩,myd數(shù)據(jù)熙涤,myi索引
show warnings
sxplain的key len代表使用了索引的字節(jié)長(zhǎng)度
myisam使用非聚簇索引
myisam索引指向行在磁盤(pán)上的位置
Innodb的索引
聚簇索引
索引文件和數(shù)據(jù)文件存儲(chǔ)在同一個(gè)文件
逐漸如果沒(méi)有規(guī)律区赵,會(huì)導(dǎo)致頁(yè)分裂(主鍵索引帶著聚簇?cái)?shù)據(jù)在磁盤(pán)上一直換位置)
索引覆蓋
說(shuō)明出現(xiàn)索引覆蓋情況, 極佳sql
Innodb的特殊問(wèn)題
第三四條sql是innodb的查詢速度
索引區(qū)分度
對(duì)于左前綴不容易區(qū)分的列
建多列索引的原則沾乘, 一定要分析區(qū)分度
出現(xiàn)filesort情況必須優(yōu)化亿昏, 原因order by的字段沒(méi)有走索引或者where條件和order by的字段不一致導(dǎo)致where占用索引,order by 被迫使用filesort芥颈, 查全表同樣會(huì)出現(xiàn)filesort抓于, 因?yàn)閙ysql直接返回所有數(shù)據(jù),再進(jìn)行排序
當(dāng)一條查詢sql觸發(fā)索引的時(shí)候浇借,MySQL底層會(huì)自動(dòng)把where條件和索引順序匹配捉撮,但是如果sql的第一個(gè)where或by不能觸發(fā)索引,則mysql底層不會(huì)把查詢where或by的條件和索引匹配
例如:索引 index(a,b,c,d)
sql? where a=1 , b=2 d>4, c= 3,那好妇垢, keylen 為4巾遭, 觸發(fā)索引所有列
sql where b=2,d>4, c=3 那好沒(méi)有處罰索引
例如:? tag和article關(guān)連表
aid?tid 1? 1
1? 2
index(aid, tid)
當(dāng)join聯(lián)查時(shí)如果根據(jù)文章查標(biāo)簽可以觸發(fā)索引
但是根據(jù)標(biāo)簽查文章就不能觸發(fā)索引
最好的解決辦法
index(tid闯估,aid)冗余索引
主要原則灼舍, 以客戶端為主,分析表的所有sql涨薪, 然后去重骑素,保留三個(gè)左右的索引原則
表修復(fù)
自我總結(jié):Innodb表應(yīng)該有唯一索引列,直接引用主鍵索引刚夺,避免出現(xiàn)根據(jù)主鍵索引讀數(shù)據(jù)献丑,導(dǎo)致索引太大末捣,從而效率極差