MYSQL索引類型+索引方法


MYSQL索引有四種

PRIMARY唯一且不能為空一張表只能有一個主鍵索引)、

INDEX(普通索引)、

UNIQUE(唯一性索引)、

FULLTEXT(全文索引:用於搜索很長一篇文章的時候,效果最好。用在比較短的文本,如果就一兩行字的,普通的 INDEX 也可以)

ALTER TABLE t_user ADD INDEX name_city_phone(USERNAME,CITY,PHONE)  //普通復合索引

ALTER TABLE t_user ADD UNIQUE name_city_phone(USERNAME,CITY,PHONE) //唯一復合索引
  這樣的組合索引,其實相當於分別建立了三個索引。
  為什么沒有(CITY,PHONE)索引這是因為 MYSQL組合查詢只從最左邊開始組合:始終包含username 【最左前綴匹配原則】
  1.USERANME,CITY,PHONE  
  2.USERNAME,CITY  
  3.USERNAME,PHONE
  並不是查詢語句包含這三列就會用到該組合索引:
  這樣的查詢語句才會用到創建的組合索引
SELECT * FROM t_user where USERNAME="parry" and CITY="廣州" and PHONE="180"
SELECT * FROM t_user where USERNAME="parry" and CITY="廣州"
SELECT * FROM t_user where USERNAME="parry" and PHONE="180" 

  這樣的查詢語句是不會用到創建的組合索引,但是會走整個索引,只是效率低下 

SELECT * FROM t_user where CITY="廣州" and PHONE="180"
SELECT * FROM t_user where CITY="廣州"

explain結果中的type字段。查詢中分別是:

  • type: index   //沒有按照復合索引順序
  • type: ref       //按照順序

index:這種類型表示mysql會對整個該索引進行掃描。要想用到這種類型的索引,只要是索引,或者某個聯合索引的一部分,mysql都可能會采用index類型的方式掃描。但是呢,缺點是效率不高
ref:這種類型表示mysql會根據特定的算法快速查找到某個符合條件的索引,不會對索引中每一個數據都進行一一的掃描判斷,會更快的取出數據。索引字段的數據必須是有序的,才能實現這種類型的查找。

tip:

雖然索引提高了查詢的速度,但是降低了INSERT、UPDATE、DELETE(DML)的速度,因為在插入、修改、刪除數據時,還要同時操作一下索引文件;

BTREE索引最左前綴匹配原則使用注意事項:

  • 最左前綴匹配原則,非常重要的原則,mysql會一直向右匹配直到遇到范圍查詢(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)順序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引則都可以用到,a,b,d的順序可以任意調整。【范圍查詢的字段,在建立復合索引一定要置后】
  • =和in可以亂序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意順序,mysql的查詢優化器會幫你優化成索引可以識別的形式

索引使用注意事項:

1.索引會忽略null值,所以我們在設計數據庫的時候設置為為NOT NULL;

2.短索引(給索引設置長度)不僅能夠提高查詢速度,而且能節省I/O操作

3.  Mysql在查詢的時候只會使用一個索引,但不是一個字段

4. 不鼓勵使用like對索引操作:like"%aaa%"不會使用索引;但like“aaa%”會使用索引。即可以對固定起始值模糊查詢

5.不適用於否地操作(not in , <>, !=,or) //用到or地方,盡量用union,或者程序兩次查找

6.如果創建了索引,但是查詢語句並沒有使用,則會使原來的效率更差

復合索引的優勢:

使用多個字段,查詢更高效,所以盡量使用復合索引

mysql的兩種索引方法(Innodb和MyISAM默認的索引是Btree索引):

1.HASH(用於對等比較,如"="和" <=>"   //<=> 安全的比對   ,用與對null值比較,語義類似is null()

2.BTREE(用於非對等比較,比如范圍查詢)>,>=,<,<=、BETWEEN、Like


免責聲明!

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



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