mysql存儲引擎掺涛,主流存儲引擎有兩種,主要區(qū)別
? ? ? ? ? ? 1.MyISAM:表操作性能高,但不支持事務(wù),InnoDB支持事務(wù),mysql5.5以后默認(rèn)的存儲引擎
? ? ? ? ? ? 2.MyISAM索引結(jié)構(gòu)為B-TREE,InnoDB索引結(jié)構(gòu)為B+TREE
? ? ? ? ? ? 3.MyISAM索引文件和數(shù)據(jù)文件分離急膀,InnoDB數(shù)據(jù)文件本身為B+TREE結(jié)構(gòu)
? ? 注:關(guān)于InnoDB使用B+TREE而不用紅黑樹。因為紅黑樹內(nèi)存操作龄捡,不適合過大的數(shù)據(jù)量操作
索引結(jié)構(gòu)類型:
? ? ? ? ? ? B-TREE:
? ? ? ? ? ? ? ? ? ? 1.樹上所有節(jié)點元素不重復(fù)卓嫂,每個節(jié)點都存儲相應(yīng)數(shù)據(jù)的引用。
? ? ? ? ? ? ? ? ? ? 2.數(shù)據(jù)從左到右遞增聘殖,
? ? ? ? ? ? ? ? ? ? 3.葉子節(jié)點不存在指針
? ? ? ? ? ? B+TREE
? ? ? ? ? ? ? ? ? ? 1.葉子節(jié)點存儲數(shù)據(jù)晨雳,包含父節(jié)點索引。非葉子節(jié)點不存儲數(shù)據(jù)奸腺,所以父節(jié)點可以存儲更多索引
? ? ? ? ? ? ? ? ? ? ? ?*注* mysql讀取按頁讀取悍募,每頁16k,每個索引節(jié)點8Byte+6Byte指針洋机,所以每頁大概1000多條數(shù)據(jù)
? ? ? ? ? ? ? ? ? ? 2.葉子節(jié)點為鏈表結(jié)構(gòu)坠宴。節(jié)點之間用指針連接,方便區(qū)間查詢
? ? ? ? ? ? ? ? ? ? 3.必須有主鍵绷旗,并推薦使用整型自增主鍵喜鼓。若表中未創(chuàng)建主鍵,則默認(rèn)生成一列主鍵
? ? ? ? ? ? ? ? ? ? 4.若為二級索引衔肢,則葉子節(jié)點存儲主鍵id庄岖。這樣能保證一致性,并節(jié)省空間角骤。
? ? ? ? ? ? ? ? ? ? 5.二級索引查詢會有回表操作隅忿,所以若查詢使用二級索引推薦使用覆蓋索引,這樣不會有回表操作邦尊,查詢性能高
? ? ? ? ? ? HASH:
? ? ? ? ? ? ? ? ? ? 查詢快背桐,僅支持等于查詢
sql索引使用注意事項
? ? ? ? ? ? 1.使用全值匹配 。即使用有索引字段等于查詢
? ? ? ? ? ? 2.最左前綴法則蝉揍。即若索引為聯(lián)合索引链峭,使用的查詢字段不可跳過索引中的列
? ? ? ? ? ? 3.不在索引列上做運算。如使用時間類型轉(zhuǎn)換又沾,left等運算弊仪,會導(dǎo)致索引失效
? ? ? ? ? ? 4.盡量使用覆蓋索引,即使用select 字段 代替select * 使用
? ? ? ? ? ? 5.not in 杖刷,not exists ,? != 励饵,is null , is not null無法使用索引
? ? ? ? ? ? 6.like操作開頭模糊無法使用索引。即%xxx
? ? ? ? ? ? 7.若為字符串滑燃,不加‘’索引可能會失效
? ? ? ? ? ? 8.in查詢有可能會使用到索引役听。在阿里規(guī)范中(泰山版)有寫in查詢不超過1000,性能影響不大
關(guān)于count(*)? count(1) count(字段)
? ? ? ? ? ? ?若字段有索引則性能差距不大,使用執(zhí)行計劃可查看