使用索引查詢時(shí),把索引列單獨(dú)放在表達(dá)式一側(cè)(id<4)覆履,否則索引可能無法生效(id-1<4);
索引的選擇性:索引不重復(fù)記錄條數(shù)/總記錄條數(shù)蹋盆,選擇性越高性能越好。
掃描索引本身很快硝全,但是如果索引不能覆蓋查詢所需的所有列栖雾,那就不得不每掃描一條記錄就都回表查詢一次對應(yīng)的行,這基本都是隨機(jī)I/O柳沙。所以按索引順序讀取數(shù)據(jù)的速度通常要要比順序的全表掃描要慢岩灭,尤其是I/O密集的工作負(fù)載時(shí)。(當(dāng)索引出大量結(jié)果需要一個(gè)個(gè)回表查詢時(shí)赂鲤,速度慢)
二級索引的葉子節(jié)點(diǎn)指向主鍵噪径,所以二級索引自帶主鍵,(column1)=(column1, id )数初。
查看表索引:
show keys(或index) from table_name\G
新建表索引:column_name(length)找爱,length可選,表示前綴索引泡孩。
create index index_name on table_name (column_name1(length), cloumn_name2);
alter table table_name add index index_name(column_name(length));
刪除表索引:
alter table table_name drop index index_name;
指定MySQL使用/忽略索引:
select * from table_nameuse/force/ignoreindex(index_name1,index_name2....) where....;
索引原理:
避免了全表掃描车摄,innodb引擎采用B+樹索引,所有的值都是按順序存儲(chǔ)的仑鸥,從索引根節(jié)點(diǎn)開始搜索吮播,比較節(jié)點(diǎn)頁的值和要查找的值,判斷要不要進(jìn)入下一個(gè)節(jié)點(diǎn)眼俊,最終存儲(chǔ)引擎要么找到對應(yīng)的值意狠,要么值不存在。
普通索引匹配原則:
最左前綴原則:索引必須從索引定義的第一個(gè)列開始匹配疮胖,如果第一個(gè)(左邊)列使用范圍匹配环戈,則后面所有列索引失效。如果范圍匹配的是字符串澎灸,則必須like 'xx%'而不能like '%xx'或者%xxx%院塞。
使用in(value1, value2)多個(gè)等值,后續(xù)條件可以使用索引性昭,如果使用<或>等范圍匹配拦止,則后續(xù)條件不能使用索引。
order by索引:
只有當(dāng)索引的列順序和order by字句順序完全一致糜颠,并且所有列的排序方向(倒序或正序)都一樣時(shí)创泄,MySQL才能使用索引對結(jié)果進(jìn)行排序艺玲。如果查詢需要關(guān)聯(lián)多張表括蝠,則只有當(dāng)order by子句引用字段都是第一個(gè)表時(shí)鞠抑,才能用索引進(jìn)行排序。并且索引排序也需要滿足最左前綴要求忌警。否則無法用索引排序搁拙,將使用文件排序。
(rental_data, inventory_id, customer_id)
例:
select rental_id, staff_id from sakila.rental
where rental_date = '2005-05-25'
order by inventory_id, customer_id desc
例:
select rental_id, staff_id from sakila.rental
where rental_date = '2005-05-25'
order by inventory_id desc
索引優(yōu)勢:
索引大大減少了服務(wù)器需要掃描的數(shù)據(jù)量法绵。
索引可以幫助服務(wù)器避免排序和零食表箕速。
索引可以將隨機(jī)I/O變?yōu)轫樞騃/O。
哈希索引:
索引中不直接存儲(chǔ)列的值朋譬,把列的hash值當(dāng)作索引盐茎,所以即使hash指是有序的但實(shí)際列是無需的,所以無法用于排序徙赢,匹配時(shí)只能精準(zhǔn)匹配字柠,比較符使用,=狡赐,<=>窑业,in()。hash碰撞低的時(shí)候性能優(yōu)秀枕屉,碰撞高性能則低常柄。
innodb不支持直接創(chuàng)建hash索引,但是有“自適應(yīng)hash索引”搀擂,即當(dāng)innodb發(fā)現(xiàn)某個(gè)索引使用頻繁會(huì)自動(dòng)在b-tree之上再創(chuàng)建一個(gè)hash索引西潘。這是完全自動(dòng)的,用戶無法控制哨颂,但可以關(guān)閉此功能喷市。當(dāng)需要對長字符做索引時(shí),建議加一列hash值列作為索引列咆蒿。
前綴索引:
對于長字符串可以使用前綴索引提高查詢性能东抹。
覆蓋索引:
如果索引的葉子節(jié)點(diǎn)中包含所要查詢的所有數(shù)據(jù)則無需回表查詢,我們稱之為覆蓋索引沃测。