標籤:rom data inno 訪問 uid lex alt 包含 bubuko
對於建立的索引(姓,名字,data)
5.1、索引對一下的查詢類型有效
1、全值匹配:能尋找姓+名為ALLEN、出生日期為1990-11-05的人;
2、最左首碼匹配:可以尋找姓為ALLEN的人;即只使用索引的第一列;
3、列首碼匹配:可以尋找姓為J開頭的人;這裡索引也只使用了第一列;
4、範圍匹配:可以尋找姓以開頭為A-J的人;這裡索引也只使用了第一列;
5、精確匹配前一列,範圍匹配後一列;
6、只訪問索引的查詢;
7、ORDER BY 也滿足索引;
5.2、索引的限制
1、沒法找到特定名字的人;
2、沒法找到以某個J結尾的姓;
3、沒法跳過索引,即沒有姓A,出生日期為XX的人;
4、範圍查詢的右邊索引失效,例如姓為AX,名字like b% ,出生日期為199-01-01的人,只使用了前兩列索引;
5.3 高效能索引策略
1、獨立的列,以下SQL失效:selext * from user where id +1 = 10;
2、選擇合適的索引列,
3、聚族索引與非聚族索引(innoDB和myisam引擎的區別)
盡量使用自增主鍵而不是uuid,因為這樣會導致資料沒有了聚集屬性;
4、索引覆蓋-如果查詢條件中已經包含了要查詢的值,那麼對於聚族索引而言,就不需要進行二次回查;
例如table 有 (id,name)的聯合索引,當sql=select id ,name from table 時,就會觸發索引覆蓋;
5、多表JOIN時,只有第一個表的ordery by條件能使用索引;
關於order by 的生效和失效條件
對於table有聯合唯一索引(a,b,c)
以下索引生效:
where a= x order by b;能使用索引,因為a是常量,而a+b組成的最左首碼索引;
where a >x order by a,b;能使用索引,因為a+b組成了聯合索引;
以下索引失效:
where a = x order by b desc,c desc ,因為兩個不同的排序方向,但是索引列都是正序排序;
where a =x order by b ,d 使用了一個不在索引中的列;
where a =x ordery c ,a+c沒法組合最左首碼組合;
where a > x order by b,c ;失效,a使用了範圍查詢條件,b,c組合失效;
6、使用In sex來不選擇性別,讓範圍查詢的欄位(例如age)排到最後;
五、MYSQL的索引