Mysql 表索引設計原則

2021-10-24 11:41:35 字數 2465 閱讀 6736

索引的優點

1.加快資料的檢索速度,這是建立索引的最主要的原因;

2.通過建立唯一性索引,可以保證資料庫表中每一行資料的唯一性;

3.加速表和表之間的連線;

4.在使用分組和排序子句進行資料檢索時,可以顯著減少查詢中分組和排序的時間。

索引的缺點

1.建立索引和維護索引要耗費時間,這種時間隨著資料量的增加而增加。

2.索引需要佔物理空間,除了資料表佔資料空間之外,每乙個索引還要佔一定的物理空間,如果要建立聚簇索引,那麼需要的空間就會更大。

3.當對表中的資料進行增加、刪除和修改的時候,索引也要同步動態的維護,這樣就降低了資料的增刪改速度。

所以單錶資料太少,索引反而會影響速度;更新非常頻繁的資料不適宜建索引

索引設計原則

根據資料庫的功能,可以在資料庫設計器中建立三種索引

唯一索引:唯一索引是不允許其中任何兩行具有相同索引值的索引

主鍵索引:表定義主鍵將自動建立主鍵索引,主鍵索引是唯一索引的特定型別。該索引要求主鍵中的每個值都唯一。當在查詢中使用主鍵索引時, 它允許對資料的快速訪問

聚集索引:表中行的物理順序與鍵值的邏輯(索引)順序相同。乙個表 只能包含乙個聚集索引

選擇索引的最終目的是為了使查詢的速度變快。下面給出的原則是最基本的準則,但不能拘泥於這些準則,應該根據應用的實際情況進行分析和判斷,選擇最合適的索引方式。

1.索引最左匹配原則

索引可以簡單如乙個列(a),也可以複雜如多個列(a, b, c, d),即聯合索引。

如果是聯合索引,那麼key也由多個列組成,同時,索引只能用於查詢key是否存在(相等),遇到範圍查詢(>、<、between、like左匹配)等就不能進一步匹配了,後續退化為線性查詢。因此,列的排列順序決定了可命中索引的列數。

例子:如有索引(a, b, c, d),查詢條件a = 1 and b = 2 and c > 3 and d = 4,則會在每個節點依次命中a、b、c,無法命中d。(很簡單:索引命中只能是相等的情況,不能是範圍匹配)

明白最左匹配原則,對我們設計索引和編寫高效sql語句非常有幫助

2.為經常需要排序、分組操作的字段建立索引

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

分組字段或者排序字段應該建立索引

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

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

where 子句中經常使用的字段應該建立索引

4.限制索引的數目

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

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

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

6.索引列不能參與計算

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

即索引列不能帶函式,否則會導致索引失效

7.擴充套件索引

盡量的擴充套件索引,不要新建索引。比如表中已經有a的索引,現在要加(a,b)的索引,那麼只需要修改原來的索引即可

8.條件帶like 注意事項

like 模糊查詢中,右模糊查詢(abc%)會使用索引,而(%abc)和(%abc%)會放棄索引而使用全表掃瞄

9.盡量使用資料量少的索引

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

10.盡量使用字首來索引

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

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

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

12.=和in可以亂序。

比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意順序,mysql的查詢優化器會幫你優化成索引可以識別的形式

13.聯合查詢

聯合查詢,子查詢等多表操作時關連欄位要加索引

mysql索引設計 MySQL索引設計原則

一 mysql常用的索引型別 1.1主鍵索引 primary key 1.2唯一索引 unique 1.3普通索引 index 1.4全文索引 1.5組合索引 二 mysql常用的資料結構 2.1b tree 2.2雜湊索引 三 索引的設計原則 3.1選擇唯一性索引 被設為唯一性的值可以設定為索引,...

MySQL 表的建立 表索引 索引的設計原則

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

MySQL索引設計原則

設計原則 低選擇性的列不加索引,如性別 常用的字段放在前面 選擇性高的字段放在前面 需要經常排序的字段,可加到索引中,列順序和最常用的排序一致 對較長的字段資料型別優先考慮字首索引如index url 64 只建立需要的索引,避免冗餘索引,如index a,b index a mysql索引的限制 ...