做網(wǎng)站不用服務(wù)器嗎鄭州網(wǎng)站開(kāi)發(fā)公司
1全職匹配我最?lèi)?ài)
是指 where 條件里 都是? = ,不是范圍(比如>,<),不是 不等于,不是 is not null,然后 這幾個(gè)字段 建立了聯(lián)合索引 ,而且符合最左原則。
那么就要比 只建立了where條件里 單獨(dú)的幾個(gè)索引 查詢(xún)起來(lái)要快。
2 最左匹配
就是where查詢(xún)條件里 得 有 按照建立聯(lián)合索引里的字段來(lái),一旦沒(méi)有最左 就沒(méi)法走索引!一旦跳過(guò)某個(gè)字段,后面的索引也沒(méi)法使用(會(huì)影響 key_len )。
比如 a,b,c 三個(gè)字段聯(lián)合索引。如果where 里有 a,c ,跳過(guò)了b,那么雖然sql 可以走 索引,但是 (key_len)長(zhǎng)度只有 a 的長(zhǎng)度。
3 主鍵插入
4 計(jì)算 函數(shù) 導(dǎo)致索引失效 。
5類(lèi)型轉(zhuǎn)化
?比如 那個(gè)字段是varchar 但是你寫(xiě)了數(shù)字 ,就會(huì)導(dǎo)致類(lèi)型轉(zhuǎn)化,然后導(dǎo)致索引失效。
int 4 個(gè)字節(jié) 為null +1 ,5 (表現(xiàn)在key_len上)
varchar 20 長(zhǎng)度 * 3, 可為 null +1,可變 再? +2, key_len是 63 。
(如果長(zhǎng)度 是 100,就 * 100)
6 范圍條件右邊的列索引失效 舉例sql:
select sql_no_cache * from student where student.age = 30 and student.name = 'abc' and student.classId > 20;
如果我們建立了聯(lián)合索引,順序是 age,classId,name?
那么這個(gè)sql,key_len 只能是 age(5)+classID(5)是10 。而 name 的索引 就沒(méi)有用到。
為什么?因?yàn)?classId 是個(gè)范圍,他右邊的 就沒(méi)法用。
按理來(lái)說(shuō)我的 1 和 2? 都應(yīng)該? 和 3 一樣,為啥 不一樣。。
解決方法... 創(chuàng)建聯(lián)合索引的時(shí)候 把等值的往前(往左放),然后范圍的往后面放。(原來(lái)如此!)
改完之后:優(yōu)雅,全都走了索引,而且走得滿(mǎn)的索引!key_len 最長(zhǎng) 5 + 303?
?7 不等于 導(dǎo)致索引失效。。
所以全值匹配的含金量在增加(不是范圍,不是不等于)
8 is null 可以走索引 is not null 無(wú)法走索引。。
解決方法:設(shè)計(jì)表的時(shí)候,not null 約束?;蛘遡nt 設(shè)置 0 ,字符類(lèi)型設(shè)置為 “”。
not like 也是無(wú)法走索引
9 like 以 通配符 % 開(kāi)頭?
上來(lái)就不確定,b+樹(shù)就沒(méi)法走,那只能全表掃描
10 or 前后 出現(xiàn)非索引的列,索引失效
這里 key3 是有個(gè)索引的 ,key2 沒(méi)有索引。
如果加是 key2 就不行了,全表掃描了
解決方法:or 兩邊字段都有索引,然后type 就是 index_merge?
?
?11 數(shù)據(jù)庫(kù)和表的字符集要統(tǒng)一
不然涉及轉(zhuǎn)化 也會(huì)讓索引失效 。都用 utf8mb4