基于InnoDB引擎
- 條件用 or 拼接可能失效
為啥呢诈胜?假設(shè)通過索引過濾獲取到的數(shù)據(jù)集為A,滿足查詢條件的結(jié)果集為B巧涧。如果A是B的子集璃赡,那么想要得到最終結(jié)果判哥,除了索引過濾后得到的數(shù)據(jù)集,是不是還要通過全表掃描來獲取數(shù)據(jù)集B - A碉考。既然需要全表掃描塌计,那為什么還需要索引過濾呢(也就是為什么需要 索引過濾 + 全表掃描 呢),直接全表掃描不就完了嗎侯谁。所以這個時候索引就不起作用了锌仅,MySQL優(yōu)化機(jī)制會直接使用全表掃描。
什么時候會出現(xiàn)A是B的子集呢墙贱?當(dāng)or拼接的左邊或者右邊不是索引列時热芹,是不是就有可能出現(xiàn)A是B的子集,所以這種情況索引會失效
為什么and拼接索引不失效呢惨撇,因?yàn)閍nd拼接的話伊脓,B肯定是A的子集,這個自己想想應(yīng)該能明白
注:這里說的拼接所用的判斷符僅限 =, >=, <= 等不會終止索引匹配的條件魁衙,不包含會終止索引匹配的條件:>报腔,< 等條件
未完.....