深入分析mysql索引何時建立比較好

2021-07-29 06:04:22 字數 3107 閱讀 2823

索引可以提高資料的檢索效率,也可以降低資料庫的io成本,並且索引還可以降低資料庫的排序成本。排序分組操作主要消耗的就是cpu資源和記憶體,所以能夠在排序分組操作中好好的利用索引將會極大地降低cpu資源的消耗。本篇文章將簡單的分析一下如何正確建立mysql資料索引。

如何判定是否需要建立索引?

1、較頻繁地作為查詢條件的字段

這個都知道。什麼是教頻繁呢?分析你執行的所有sql語句。最好將他們乙個個都列出來。然後分析,發現其中有些欄位在大部分的sql語句查詢時候都會用到,那麼就果斷為他建立索引。

2、唯一性太差的字段不適合建立索引

什麼是唯一性太差的字段。如狀態字段、型別字段。那些只儲存固定幾個值的字段,例如使用者登入狀態、訊息的status等。這個涉及到了索引掃瞄的特性。例如:通過索引查詢鍵值為a和b的某些資料,通過a找到某條相符合的資料,這條資料在x頁上面,然後繼續掃瞄,又發現符合a的資料出現在了y頁上面,那麼儲存引擎就會丟棄x頁面的資料,然後儲存y頁面上的資料,一直到查詢完所有對應a的資料,然後查詢b欄位,發現x頁面上面又有對應b欄位的資料,那麼他就會再次掃瞄x頁面,等於x頁面就會被掃瞄2次甚至多次。以此類推,所以同乙個資料頁可能會被多次重複的讀取,丟棄,在讀取,這無疑給儲存引擎極大地增加了io的負擔。

3、更新太頻繁地字段不適合建立索引

當你為這個字段建立索引時候,當你再次更新這個字段資料時,資料庫會自動更新他的索引,所以當這個字段更新太頻繁地時候那麼就是不斷的更新索引,效能的影響可想而知。大概被檢索幾十次會更新一次的字段才比較符合建立索引的規範。而如果乙個字段同乙個時間段內被更新多次,那麼果斷不能為他建立索引。

4、不會出現在where條件中的字段不該建立索引

注意:

並非所有的資料庫都以相同的方式使用索引。作為通用規則,只有當經常查詢索引列中的資料時,才需要在表上建立索引。索引占用磁碟空間,並且降低新增、刪除和更新行的速度。在多數情況下,索引用於資料檢索的速度優勢大大超過它的不足之處。但是,如果應用程式非常頻繁地更新資料或磁碟空間有限,則可能需要限制索引的數量。

可以基於資料庫表中的單列或多列建立索引。多列索引使您可以區分其中一列可能有相同值的行。

如果經常同時搜尋兩列或多列或按兩列或多列排序時,索引也很有幫助。例如,如果經常在同一查詢中為姓和名兩列設定判據,那麼在這兩列上建立多列索引將很有意義。

確定索引的有效性:

● 檢查查詢的 where 和 join 子句。在任一子句中包括的每一列都是索引可以選擇的物件。

● 對新索引進行試驗以檢查它對執行查詢效能的影響。

● 考慮已在表上建立的索參數量。最好避免在單個表上有很多索引。

● 檢查已在表上建立的索引的定義。最好避免包含共享列的重疊索引。

● 檢查某列中唯一資料值的數量,並將該數量與表中的行數進行比較。比較的結果就是該列的可選擇性,這有助於確定該列是否適合建立索引,如果適合,確定索引的型別。

mysql何時使用索引

對乙個鍵碼使用》, >=, =, <, <=, if null和between

select * from table_name where key_part1=1 and key_part2 > 5; 

select * from table_name where key_part1 is null;

當使用不以萬用字元開始的like

select * from table_name where key_part1 like 'jani%'

在進行聯結時從另乙個表中提取行時

select * from t1,t2 where t1.col=t2.key_part

找出指定索引的max()或min()值

select min(key_part2),max(key_part2) from table_name where key_part1=10

乙個鍵碼的字首使用order by或group by

select * from foo order by key_part1,key_part2,key_part3

在所有用在查詢中的列是鍵碼的一部分時間

select key_part3 from table_name where key_part1=1

mysql何時不使用索引

如果mysql能估計出它將可能比掃瞄整張表還要快時,則不使用索引。例如如果key_part1均勻分布在1和100之間,下列查詢中使用索引就不是很好:

select * from table_name where key_part1 > 1 and key_part1 < 90

如果使用heap表且不用=搜尋所有鍵碼部分。

在heap表上使用order by。

如果不是用鍵碼第一部分

select * from table_name where key_part2=1

如果使用以乙個萬用字元開始的like

select * from table_name where key_part1 like '%jani%'

搜尋乙個索引而在另乙個索引上做order by

select * from table_name where key_part1 = # order by key2

建立mysql資料庫索引需要注意的幾個問題

1.建立索引的時機:若表中的某欄位出現在select、過濾、排序條件中,為該字段建立索引是值得的。 

2.對於like %***的模糊查詢,普通的索引是無法滿足的,需要建立全文索引。 

3.對於有多個條件的,比如: "...where a=xx and b=yy","...where a=xx order by b","...where a=xx group by b"。需要使用組合索引。但是組合索引只能在sql語句中滿足"最左字首"的條件下使用。且組合索引有一些***,如索引尺寸可能比資料本身大,因為組合索引的組合條目多。所以在實際應用中,要量身定做,使用慢查詢分析工具分析。 

4.開啟索引快取,直接在記憶體中查詢索引,不用再磁碟中。 

5.建立索引是有代價的,當update、delete語句執行時,會使得索引更新,將耗掉更多的時間。可以使用mysqlreport報告,了解select、update、delete、insert、replace各語句所佔的百分比.

MySQL 深入分析MySQL索引機制的實現

資料庫是乙個只要從事後端開發,就永遠離不開的技術,大部分企業選擇的資料庫都是mysql,所以需要我們對mysql有著足夠的了解。而mysql索引,我們都知道提高效能要加索引,也知道索引的結構是b tree,也都可以說出幾條加索引的原則,但再深入一點,往往就會詞窮,這可能就是知其然而不知其所以然的結果...

建立守護程序的深入分析

原文 建立守護程序的過程有兩種 一 fork兩次 int main 二 int main 其實兩種方法在某種程度上來說都可以,但是double fork會帶來一些區別。首先,我們得搞清楚這些 都幹了什麼 1 第一次fork,確保當前的process一定不是session leader,關於sessi...

IsPostBack深入分析

1 ispostback 介紹 ispostback是 page類有乙個 bool型別的屬性,用來判斷針對當前 form的請求是第一次還是非第一次請求。當 ispostback true時表示非第一次請求,我們稱為 postback,當 ispostback false時表示第一次請求。在 asp....