日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MySql - 索引

發(fā)布時間:2025/7/14 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySql - 索引 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

索引長度

索引長度短,區(qū)分度就低,索引長度長,區(qū)分度高,查詢效率高,但是索引要占內(nèi)存,所以要找到一個平衡點;

舉個例子: (張,張三,張三哥),如果索引長度取1的話,那么每一行的索引都是 張 這個字,完全沒有區(qū)分度,結(jié)果這樣三行完全是隨機排的,因為索引都一樣;如果長度取2,那么排序的時候至少前兩個是排對了的,如果取3,區(qū)分度達(dá)到100%,已經(jīng)提前排序;

有一些特殊的字段比如url,絕大部分的url都是 http://www. 開頭的,這種情況下索引長度取取到11都是無效的,需要更長的索引,那么有沒有優(yōu)雅的方式來解決呢;
第一種方法: 可以將數(shù)據(jù)倒序存入數(shù)據(jù)庫;
第二種方法:對字符串進(jìn)行crc32哈希處理;

建立索引

在多個Where條件的時候,會優(yōu)先采用rows最少的索引。如果多個Where條件查詢很頻繁,則將where中所有字段加到聯(lián)合索引。
注意:

  • 數(shù)據(jù)區(qū)分度低的不應(yīng)建立索引,比如sex就0、1,即區(qū)分50%。一般若rows大于總數(shù)據(jù)條數(shù)20%,則數(shù)據(jù)庫走全表掃描。
  • 如果該表大部分是單條查詢,則應(yīng)使用hash索引,因為B-Tree索引時間復(fù)雜度O(log(n)),Hash索引為O(1)。
  • where子句的查詢條件里有 != ,索引將無效。可以優(yōu)化為in(xx, xx)
  • where子句使用了sql函數(shù)的時候,索引將無效,比如:select * from tb where YEAR(data) < '2017'; 可優(yōu)化為 data < CURDATE()
  • LIKE查詢必須是前綴固定的,否則無法使用索引。如:Title%可以使用索引,%Title和%Title%不能使用索引。
  • 索引列盡量避免NULL,應(yīng)該指定列為NOT
    NULL或設(shè)置默認(rèn)值。在MySQL中,含有NULL值的列很難進(jìn)行查詢優(yōu)化,因為它們使得索引、索引的統(tǒng)計信息以及比較運算更加復(fù)雜。索引不存Null值,所以會導(dǎo)致 SELECT * FROM tb WHERE name != 'xxx' 不會返回name為Null的數(shù)據(jù)。
  • 對于復(fù)合索引(key1, key2),select * from tb where key1 = xxx and key2 = xxx 或 select * from tb where key1 = xxx 會走復(fù)合索引,而 select * from tb where key2 = xxx 不會走復(fù)合索引。即最左前綴匹配。
  • 當(dāng)你需要在一篇大的文章中搜索一個詞時,如: “WHERE content LIKE
    ‘%apple%’”,索引是沒有意義的,這需要全文索引。InnoDB引擎對FULLTEXT索引的支持是MySQL5.6新引入的特性,可對CHAR、VARCHAR、TEXT類型的列創(chuàng)建全文索引,全文搜索的語法:MATCH(col1,col2,…) AGAINST (expr[search_modifier]),默認(rèn)情況下全文搜索大小寫不敏感。
  • 不要觸發(fā)強制類型掃描,比如 select * from tb where phone = 18812345678,其中phone為varchar,這不會走索引。
  • 在col_1和col_2上建立索引,不要select * from tb col_1=2 or col_2=2,應(yīng)優(yōu)化為select * from tb where col_1=2 union select * from tb where col_2=2。

索引覆蓋(復(fù)合索引)

對于select key_1 ?from t where key_2 ·····;這樣的查詢,查詢的處理過程為:首先去檢索key_2索引找到主鍵id,然后根據(jù)主鍵id去檢索正確的數(shù)據(jù)行。這樣就是兩次檢索。
將key_1和key_2加到聯(lián)合索引,InnoDB可以直接在索引中獲取結(jié)果數(shù)據(jù)集,這就是索引覆蓋。

以下情況,InnoDB無法覆蓋查詢:
1 select選擇的字段中含有不在索引中的字段 ,也即索引沒有覆蓋全部的列。
2 where 條件中不能含有對索引進(jìn)行l(wèi)ike的操作。

Join的列索引化

如果應(yīng)用程序有很多 JOIN 查詢,你應(yīng)該確認(rèn)兩個表中Join的字段是被建過索引的。這樣,MySQL內(nèi)部會啟動為你優(yōu)化Join的SQL語句的機制。Join的字段,應(yīng)該是相同的類型的,對于STRING類型,還需要有相同的字符集才行。(兩個表的字符集有可能不一樣)

總結(jié)

以上是生活随笔為你收集整理的MySql - 索引的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。