建立MySQL索引的原則及如何使用索引

2021-10-21 17:22:04 字數 2067 閱讀 9369

選擇唯一性索引

唯一性索引的值是唯一的,可以更快速的通過該索引來確定某條記錄。例如,學生表中學號是具有唯一性的字段。為該字段建立唯一性索引可以很快的確定某個學生的資訊。如果使用姓名的話,可能存在同名現象,從而降低查詢速度。

為經常需要排序、分組和聯合操作的字段建立索引

經常需要order by、group by、distinct和union等操作的字段,排序操作會浪費很多時間。如果為其建立索引,可以有效地避免排序操作。

為常作為查詢條件的字段建立索引

如果某個字段經常用來做查詢條件,那麼該字段的查詢速度會影響整個表的查詢速度。因此,為這樣的字段建立索引,可以提高整個表的查詢速度。

限制索引的數目

索引的數目不是越多越好。每個索引都需要占用磁碟空間,索引越多,需要的磁碟空間就越大。修改表時,對索引的重構和更新很麻煩。越多的索引,會使更新表變得很浪費時間。

盡量使用資料量少的索引

如果索引的值很長,那麼查詢的速度會受到影響。例如,對乙個char(100)型別的字段進行全文檢索需要的時間肯定要比對char(10)型別的字段需要的時間要多。

盡量使用字首來索引

如果索引欄位的值很長,最好使用值的字首來索引。例如,text和blog型別的字段,進行全文檢索會很浪費時間。如果只檢索欄位的前面的若干個字元,這樣可以提高檢索速度。

刪除不再使用或者很少使用的索引

表中的資料被大量更新,或者資料的使用方式被改變後,原有的一些索引可能不再需要。資料庫管理員應當定期找出這些索引,將它們刪除,從而減少索引對更新操作的影響。

最左字首匹配原則,非常重要的原則。

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的查詢優化器會幫你優化成索引可以識別的形式。

盡量選擇區分度高的列作為索引。

區分度的公式是count(distinct col)/count(*),表示欄位不重複的比例,比例越大我們掃瞄的記錄數越少,唯一鍵的區分度是1,而一些狀態、性別字段可能在大資料面前區分度就是0,那可能有人會問,這個比例有什麼經驗值嗎?使用場景不同,這個值也很難確定,一般需要join的字段我們都要求是0.1以上,即平均1條掃瞄10條記錄。

索引列不能參與計算,保持列「乾淨」

比如from_unixtime(create_time) = '2014-05-29』就不能使用到索引,原因很簡單,b+樹中存的都是資料表中的字段值,但進行檢索時,需要把所有元素都應用函式才能比較,顯然成本太大。所以語句應該寫成create_time = unix_timestamp(『2014-05-29』)。

盡量的擴充套件索引,不要新建索引。

比如表中已經有a的索引,現在要加(a,b)的索引,那麼只需要修改原來的索引即可。

在連線查詢join語句執行過程中,驅動表是走全表掃瞄,而被驅動表是走樹搜尋。所以我們盡量需要讓小表做驅動表。(在決定哪個表做驅動表的時候,應該是兩個表按照各自的條件過濾,過濾完成之後,計算參與join的各個欄位的總資料量,資料量小的那個表,就是「小表」,應該作為驅動表)

盡量使用連線查詢代替子查詢,子查詢效率太差,執行子查詢時,mysql 需要建立臨時表,查詢完畢後再刪除這些臨時表,所以,子查詢的速度會受到一定的影響,這裡多了乙個建立和銷毀臨時表的過程

索引列務必重複度低,where 條件欄位上需要建立索引

使用索引就不能用or查詢,否則索引不起作用

使用索引,like模糊查詢不能以%開頭

查詢條件務必以索引列開頭,否則索引失效

復合索引遵守最左原則

根據業務場景建立覆蓋索引只查詢業務需要的字段,如果這些欄位被索引覆蓋,將極大的提高查詢效率

多表連線的字段上需要建立索引,這樣可以極大提高表連線的效率

where 條件欄位上需要建立索引,但where 條件上不要使用運算函式,以免索引失效

排序欄位上,分組欄位上需要建立索引

優化insert語句:批量列插入資料要比單個列插入資料效率高

mysql建立索引型別及索引建立的原則

索引型別 unique 唯一索引,一般為主鍵 normal 一般索引,普通字段,可做組合索引 索引方法 btree 1 選擇唯一性索引 唯一性索引的值是唯一的,可以更快速的通過該索引來確定某條記錄。例如,學生表中學號是具有唯一性的字段。為該字段建立唯一性索引可以很快的確定某個學生的資訊。如果使用姓名...

MySql 建立索引原則

為了使索引的使用效率更高,在建立索引時,必須考慮在哪些欄位上建立索引和建立什麼型別的索引。本小節將向讀者介紹一些索引的設計原則。1 選擇唯一性索引 唯一性索引的值是唯一的,可以更快速的通過該索引來確定某條記錄。例如,學生表中學號是具有唯一性的字段。為該字段建立唯一性索引可以很快的確定某個學生的資訊。...

Mysql索引建立原則

在mysql中使用索引的原則有以下幾點 1 對於查詢頻率高的字段建立索引 2 對排序 分組 聯合查詢頻率高的字段建立索引 3 索引的數目不宜太多 原因 a 每建立乙個索引都會占用相應的物理控制項 b 過多的索引會導致insert update delete語句的執行效率降低 4 若在實際中,需要將多...