內(nèi)存不可完全緩存所有數(shù)據(jù)的時(shí)候倾芝,體現(xiàn)索引的重要性专控。
MySQL支持的索引,不同的存儲(chǔ)引擎支持不同的類型
B-tree索引
B-tree索引的特點(diǎn)
? ? 以B+樹結(jié)構(gòu)存儲(chǔ)數(shù)據(jù)
? ? 可加快數(shù)據(jù)的查詢速度
????適合范圍查找
B-tree的使用情況
? ? 1俭识、全值匹配的chaxun
? ? ? ? order_sn = "123456789987655";
? ? 2凉倚、匹配最左前綴的查詢
? ? ? ? 如果建立的所用是[order_sn,order_date],這時(shí)用order_sn查找還是可以找到的兼都。查找order_sn =?"123456789987655"為查找條件是可以找到的,如果order_date ='2016-11-03',則不可以找到稽寒。
? ? 3扮碧、匹配列前綴
????????order_sn like '9876%'
? ? 4、匹配范圍的查詢
? ? order_sn>'123456789';
? ??order_sn<'123456789';
? ? 5杏糙、精確匹配左前列并范圍匹配另一列
? ? 可精確匹配order_sn 列慎王,而order_date 是在范圍內(nèi)匹配。
? ? 6宏侍、只訪問(wèn)索引的查詢
限制:
? ? 1赖淤、如果不是按索引最左列開始查找,則無(wú)法使用索引
? ? ?2谅河、使用索引時(shí)不能跳過(guò)左邊索引中的列
? ? 3咱旱、Not in 和<>操作無(wú)法使用索引
? ? 4、如果查詢中有某個(gè)列的查詢范圍绷耍,則其右邊所有列都無(wú)法使用索引
Hash索引
Hash索引的特點(diǎn)
memory和innodb都支持
????????hash索引是基于Hash表實(shí)現(xiàn)的吐限,只有查詢條件精確匹配Hash索引中的所有列時(shí),才能夠使用到hash索引褂始。
? ? ? ? 對(duì)于Hash索引中的所有列诸典,存儲(chǔ)引擎會(huì)為每一行計(jì)算一個(gè)hash碼,Hash索引中存儲(chǔ)的就是Hash碼崎苗。
限制:
1狐粱、兩次查找
2、以hash碼存儲(chǔ)無(wú)法用于排序
3胆数、不支持部分索引查找也不支持范圍查找
4脑奠、可產(chǎn)生Hash沖突
為什么使用索引
1、大量減少存儲(chǔ)引擎需要掃描的的數(shù)據(jù)量
2幅慌、索引可幫助我們進(jìn)行排序宋欺,以避免使用臨時(shí)表
3、索引可以把隨機(jī)I/O變?yōu)轫樞騃/O
影響
1胰伍、索引會(huì)增加寫操作的成本
2齿诞、太多的索引增加查詢時(shí)間
索引優(yōu)化
1、索引列上不能使用表達(dá)式或函數(shù)
問(wèn)題語(yǔ)句:
select ...... from product?
where to_days(out_date) - to_days(current_date)<=30?
to_days:函數(shù)
out_date:索引列
優(yōu)化語(yǔ)句:
?select ...... from product?
where out_date <= date_add(current_date,interval 30 day);
2骂租、前綴索引和索引列的選擇性
mysql B-tree 索引對(duì)鍵值的大小是有限制的祷杈。根據(jù)存儲(chǔ)引擎的不同而不同,對(duì)于innodb來(lái)說(shuō)索引最大的大小不能超過(guò)767個(gè)字節(jié)(255字符)渗饮,而myIsam最大不超過(guò)1000個(gè)字節(jié)但汞。當(dāng)字段比較大的時(shí)候宿刮,MySQL支持對(duì)前綴進(jìn)行索引
? ? 前綴索引和索引列的選擇性
? ? create index index_name on table(col_name(n));
? ? 索引的選擇性是不重復(fù)的索引值和表的記錄數(shù)的比值
3、聯(lián)合索引
? ? 選擇索引列的順序
? ? ????經(jīng)常會(huì)被使用到的列優(yōu)先
? ? ? ? 選擇性高的列優(yōu)先
? ? ? ? 寬度比較小的列優(yōu)先(選擇性高前提)
4私蕾、覆蓋索引
? ? ? ? 通過(guò)B-tree索引直接獲得所需的數(shù)據(jù)僵缺,通過(guò)索引關(guān)鍵字直接索引存儲(chǔ)的信息,就不需要再讀取行的信息踩叭。包含所有查詢字段全部值的索引我們稱為覆蓋索引磕潮。這里的全部值包括where groupBy orderBy中的值
????????可優(yōu)化緩存、減少I/O
select language_id 是using index來(lái)自索引獲取數(shù)據(jù)
select * 是use where 將所有數(shù)據(jù)裝于內(nèi)存中容贝,用where條件過(guò)濾自脯。
使用索引來(lái)優(yōu)化查詢
1、使用索引掃描來(lái)優(yōu)化排數(shù)
? ? 索引的列順序和orderby子句的順序完全一致
? ? 索引中所有列的方向(升序斤富,降序)和orderby子句完全一致
? ? Order by中的字段全部在關(guān)聯(lián)表中的第一張表中膏潮。
2、B-tree模擬Hash索引優(yōu)化查詢
索引的維護(hù)和優(yōu)化
刪除冗余索引
pt-duplicate-key-checker h=127.0.0.1
查找未被使用過(guò)的索引