MySQL索引(索引失效)


索引

索引也是一張表,該表保存了主鍵與索引字段,並指向實體表的記錄。

 

myisam存儲引擎,數據文件、索引文件、表結構文件分開存儲

innodb存儲引擎,數據和索引存儲在一個文件中

B+tree索引

hash索引

 

hash索引(只有memory存儲引擎支持),查找一條記錄的速度非常快

B+tree索引(Innodb和MyISAM支持),更適合排序等操作

 

適合作索引的數據類型

(1)較小的數據類型,需要更少的空間

(2)簡單的數據類型,整型比字符串開銷小

(3)避免使用null,null會導致索引失效

 

主鍵索引

唯一索引

普通索引

全文索引

組合索引

 

顯示當前表的所有索引信息

show index from tableName\G

 

1.普通索引

create index idx_name on tableName(colName(length))

如果是char或者varchar length可以小於實際的長度,如果是blob和text 必須指定length

alter table tableName add index idx_name(colName)

drop index idx_name on tableName

一張表可以有多個普通索引

2. 唯一索引

列的值必須唯一,允許用null值

如果是組合索引,列的值的組合必須唯一

create union index idx_name on tableName(colName)

alter table table_name add unique idx_name(colName)

一張表可以有多個唯一索引

3.主鍵索引

主鍵的數據類型最好為整型

主鍵索引只能有一個

主鍵列的值必須唯一並且不能是null

自動增長的列一定是主鍵

主鍵列不一定是自動增長的

alter table tableName add primary key(col_name)

4.全文索引

innodb不支持

alter table tableName add fulltext idx_name(col_name)

 

 

 

索引失效

1.最佳左前綴原則

  組合索引,不按索引定義時制定的順序 的最左列開始

2.like ‘%Z’ 

  like模糊查詢時, 以%開頭,導致索引失效

3.范圍之后全失效(> <)

  如果是主鍵或者索引列是整數,索引不會失效

4.遇到null值,索引失效

5.索引列上的顯式或者隱式運算,導致索引失效

6.order by

  由於查詢只使用一個索引,因此,如果where語句使用了索引,order by語句不會使用

7.不在一個方向的order by導致索引失效

  全asc 或 全desc

8.組合索引,中間跳過了某一列,后面的列全失效

9.is null is not null != <> 都會導致索引失效,如果這些用在主鍵列上,仍會使用索引

10.字符串類型不加單引號,導致索引失效

  不加單引號,會有隱式的類型轉化(索引列上的計算會導致索引失效)

11.用or連接導致索引失效

  or條件有未建立索引的列導致索引失效

 

應當避免select * ,使用覆蓋索引

count(1)或者count(col)代替count(*)

列的可取值較少時,不建議使用索引(性別)

使用char代替varchar

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM