索引是什么?
索引是一種幫助MySql高效獲取數(shù)據(jù)的一種數(shù)據(jù)結(jié)構(gòu)(B+Tree索引和Hash索引),一般默認(rèn)是B+樹
優(yōu)點(diǎn):1.提高查詢效率,降低IO使用率
? ? ? ? ? ?2.降低CPU的使用率(B樹本身就是一個(gè)排序好的結(jié)構(gòu),排序的時(shí)候直接使用)
缺點(diǎn):1.本身占用內(nèi)存,一般存在于硬盤
? ? ? ? ? ?2.降低增刪改的效率
? ? ? ? ??
索引為什么快?
因?yàn)橛玫氖荁+樹,查找的時(shí)候通過索引列表迅速定位到數(shù)據(jù)存放的位置
索引選擇的原則?
1.占用存儲(chǔ)空間少以及存儲(chǔ)空間固定的字段
2.經(jīng)常使用的字段,如where子句中的
3.更新頻繁的字段不適合做索引
4.最左前綴原則
什么是最左前綴原則?
mysql聯(lián)合索引的時(shí)候,最左優(yōu)先。如果是abc三列索引,則a,ab,abc都能建立索引,否則會(huì)索引失效
索引覆蓋:
不讀取源文件,只從索引文件中獲取數(shù)據(jù)(不需要回表查詢)using index
索引的優(yōu)化:
1.根據(jù)sql解析的順序,調(diào)整索引的順序
2.范圍查詢in有時(shí)候會(huì)導(dǎo)致索引失效,可以交換索引順序,把in放在最后面
3.最佳左前綴,保證順序一致性
4.小表驅(qū)動(dòng)大表
5.建立在經(jīng)常使用的字段
優(yōu)化sql的方法:
1.exist和in(聯(lián)表查詢中):如果主查詢的數(shù)據(jù)集大,用in
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 如果子查詢的數(shù)據(jù)集大,用exist
2.order by的優(yōu)化:雙路排序和單路排序
索引的失效:
1.復(fù)合索引沒有按照最左前綴原則
2.在索引上進(jìn)行操作(計(jì)算,函數(shù),類型轉(zhuǎn)換)
3.復(fù)合索引不能使用!= <>或者is null,否則會(huì)失效
4.like盡量以常量開頭,%開頭會(huì)導(dǎo)致索引失效
5.類型轉(zhuǎn)換會(huì)導(dǎo)致索引失效
6.使用or
慢查詢優(yōu)化思路:
1.開啟慢查詢?nèi)罩竟δ埽崖齭ql找出來
2.選用合適的字段類型做索引,節(jié)省空間
3.子查詢的exist和in
4.使用join代替子查詢:這樣就不用創(chuàng)建臨時(shí)表了,但是也不是很高效
可以對關(guān)聯(lián)查詢進(jìn)行分解,就是對每個(gè)表進(jìn)行一次單表查詢,把查詢結(jié)果關(guān)聯(lián)起來
5.不用select *?
6. 給where子句和order by子句涉及到的列創(chuàng)建索引
7.保證最左前綴原則