如何高效地利用MySQL索引

2021-07-23 20:04:00 字數 1658 閱讀 5517

(1)在經常做搜尋的列上,也就是where子句裡經常出現的列,考慮加上索引,加快搜尋速度。

(2)唯一標識記錄的列,應該加上唯一索引,強制該列的唯一性並且加快按該列查詢記錄的速度。

(3)在內連線使用的列上加上索引,最好是在內連線用到欄位都加上,因為mysql優化器會自動地選擇連線順序,然後觀察索引的使用情況,將沒用的索引刪除即可。

(4)在需要排序的列上加上索引,因為索引本身是按順序的組織的,它可以避免 filesort,要知道,server層在進行排序時是在記憶體中進行的,非常消耗資源。

(5)可以考慮實現覆蓋索引,即根據 select 的所有欄位上建立聯合索引,這樣儲存引擎只用讀取索引而不用去回表查詢,極大地減少了對資料表的訪問,大大地提高了效能。

(6)對於那些選擇性很小的列,比如性別列,增加索引並不能明顯加快查詢速度,反而該索引會成為表的累贅。

(7)對於那些定義為text, image和bit資料型別的列不應該增加索引。這是因為,這些列的要麼資料量相當大,要麼取值很少。

(8)當對寫效能的要求遠遠大於讀效能時,不應該建立索引。寫效能和讀效能是互相矛盾的。這是因為,維護乙個 b+tree 成本是非常大的,對索引的寫會涉及到頁的**等。

(9)復合索引的幾個字段是否經常同時以and方式出現在where子句中?單字段查詢是否極少甚至沒有?如果是,則可以建立復合索引,否則考慮單字段索引。這還是說明,滿足查詢效能的前提下,索引越少越好。

(10)如果復合索引所包含的字段超過3個,那麼仔細考慮其必要性,考慮減少復合的字段。

(11)在用於group by的列上加上索引,避免使用臨時表。

(12)對於較長的字元列,如 char、varchar等,由於字串的比較相對來說非常耗時,因此考慮使用字首索引減少索引長度,或者建立自定義雜湊索引,將字串對映成整數,然後以該整數作為索引,同時以字串的值作為過濾條件。

我們在建立索引時,可以根據下面原則進行簡單判斷:索引是否將相關記錄集合到了一起,從未減少了磁碟i/o,加快搜尋速度?索引中資料的排列順序是否和查詢的資料的排列順序一致,從而避免了server層的排序?索引中的列是否包含了查詢中需要的全部列從而實現了覆蓋索引? 這幾個條件層層遞進,滿足得越多越好。

(1)使用了運算子 !=,以及關鍵字not in,not exist,>,《等,總之產生的結果集很大時(也在where條件進行大範圍的選擇時),往往導致引擎不使用索引而是走全盤掃瞄。因為如果使用索引會造成大量的隨機i/o,得不償失。

(2)如果對索引列進行運算,如 where substr(name, 1, 3)=『mark』,儲存引擎並不能聰明地判斷哪些索引滿足等式,因此不能使用到索引。

(3)使用到了like,並且萬用字元在最前面時,不能使用索引。

(4)對於聯合索引 (a, b, c),如果沒用到最左列,那麼一般情況下都使用不到索引。但是,比如統計操作 count(*) where a > ***,是可以使用到該聯合索引的。畢竟統計這類操作,它不是檢索,並不需要索引完全有序。

(5)對於聯合索引,如果某個列使用了範圍查詢,那麼其右邊的列都無法作為索引優化查詢,但是由於 icp(index condition pushdown),這些列能作為過濾條件在儲存引擎中對資料進行過濾。

(6)如果條件中有 or,則必須每個or用到的字段都有索引,否則不能使用任何索引。

(7)想在聯合查詢中使用索引來避免 filesort,則關聯查詢中的order by用到的字段必須全部是第一張表(驅動表)上的。

mysql建立高效索引 mysql建立高效索引分析

一 如何建立理想的索引?查詢頻繁度 區分度索引長度 覆蓋字段 1.1區分度 假設100萬使用者,性別基本上男 女各為50w,區分度就低。1.2長度小 索引長度直接影響索引檔案的大小,影響增刪改的速度,並間接影響查詢速度 占用記憶體多 1.3區分度高,長度小 如何讓區分度高,而長度小?可以針對列中的值...

企業如何成功地利用大資料

大資料術語專指21世紀企業所面對的各種資料渠道和資訊 隨著數字領域的開始,這些不同的渠道也越來越多,同時產生越來越多的資料,這些資料量已超過以往任何時候。從更廣義上來講,大資料僅僅是指企業營銷 即市場調研和分析 的乙個組成部分。大資料能夠幫助企業確定客戶的需求 偏好和願望,並能夠幫助他們了解如何滿足...

如何更好地利用git lab組織團隊開發

大多開發的小夥伴對git並不陌生,利用git可以進行團隊協作開發,並且可以記錄 的迭代歷史,出問題時容易回溯,諸多優點不一一枚舉。這篇文章預設您是懂得git的基本知識的,旨在幫助您更有效率的使用gitlab。首先不論團隊規模,master分支永遠是與線上的 同步,這是毋庸置疑的。專案開始前,團隊le...