mysql資料庫索引學習

2021-09-24 21:10:28 字數 3079 閱讀 5894

最近做的乙個專案用的是mysql資料,編寫sql 的時候,因為業務複雜,經常有很多表聯合查詢的sql需要編寫,於是我就思考著,如果資料量將來打起來後,這麼複雜的sql執行起來會不會慢,後人接手我的專案後,會不會因為效能原因罵我?帶著問題,開始學習mysql索引相關的內容起來。學了一段,寫篇文章記錄一下,做個總結,也給自己留點資料。

在關聯式資料庫中,索引是一種單獨的、物理的對資料庫表中一列或多列的值進行排序的一種儲存結構,它是某個表中一列或若干列值的集合和相應的指向表中物理標識這些值的資料頁的邏輯指標清單。

相當於圖書的目錄,可以根據目錄中的頁碼快速找到所需的內容。索引提供指向儲存在表的指定列中的資料值的指標,然後根據您指定的排序順序對這些指標排序。資料庫使用索引以找到特定值,然後順指標找到包含該值的行。這樣可以使對應於表的sql語句執行得更快,可快速訪問資料庫表中的特定資訊。

索引的具體建立方法,create index命令就可以操作了,具體因資料庫伺服器開發廠家不同略有不同。但目前多數開發人員都會使用資料庫客戶端工具運算元據庫以及庫表,主鍵和索引都可以用視覺化工具操作,比命令方便多了。我感覺我都忘了命令怎麼敲了,還是工具方便,所以下面就不講索引的建立命令了,就列下具體的索引型別大家了解下:

1  普通索引

最基本的索引型別,沒有唯一性之類的限制。

2  唯一索引

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

3  主鍵索引

簡稱為主索引,資料庫表中一列或列組合(字段)的值唯一標識表中的每一行。該列稱為表的主鍵。

在資料庫關係圖中為表定義主鍵將自動建立主鍵索引,主鍵索引是唯一索引的特定型別。該索引要求主鍵中的每個值都唯一。當在查詢中使用主鍵索引時,它還允許對資料的快速訪問。提示儘管唯一索引有助於定位資訊,但為獲得最佳效能結果,建議改用主鍵索引。

4   候選索引

與主索引一樣要求字段值的唯一性,並決定了處理記錄的順序。在資料庫和自由表中,可以為每個表建立多個候選索引。

5  聚集索引

也稱為聚簇索引,在聚集索引中,表中行的物理順序與鍵值的邏輯(索引)順序相同。乙個表只能包含乙個聚集索引, 即如果存在聚集索引,就不能再指定clustered 關鍵字。索引不是聚集索引,則表中行的物理順序與鍵值的邏輯順序不匹配。與非聚集索引相比,聚集索引通常提供更快的資料訪問速度。聚集索引更適用於對很少對基表進行增刪改操作的情況。

6  非聚集索引

也叫非簇索引,在非聚集索引中,資料庫表中記錄的物理順序與索引順序可以不相同。乙個表中只能有乙個聚集索引,但表中的每一列都可以有自己的非聚集索引。

7  全文索引

從3.23.23版開始支援全文索引和全文檢索,fulltext, 可以在char、varchar或text型別的列上建立。 

8  復合索引   

比如 建立乙個索引 ,該索引由 a,b,c三列值聯合起作用。那麼當查詢條件為a,或者a,b,或者a,b,c時才會使用上這個索引這個規則就最左字首原則。關於該原則,明天晚上再補上。

1  條件查詢,比如 select * from table where columnname='' .....

2  表連線,比如select * from a a left join b b on a.columnname=b.columnname,檢查查詢的 where 和 join 子句。在任一           子句中包括的每一列都是索引可以選擇的物件。

3  group by語句後的列,或者order by後面的列

以上幾種場景的查詢列都可以根據情況加索引。如果表資料量不是很大,就不必加了。索引只有再資料量很大的情況下,才能表現出明顯的效率差別。對於有些列不應該建立索引。一般來說,不應該建立索引的的這些列具有下列特點:

第一,對於那些在查詢中很少使用或者參考的列不應該建立索引。這是因為,既然這些列很少使用到,因此有索引或者無索引,並不能提高查詢速度。相反,由於增加了索引,反而降低了系統的維護速度和增大了空間需求。

第二,對於那些只有很少資料值的列也不應該增加索引。這是因為,由於這些列的取值很少,例如人事表的性別列,在查詢的結果中,結果集的資料行佔了表中資料行的很大比例,即需要在表中搜尋的資料行的比例很大。增加索引,並不能明顯加快檢索速度。

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

第四,當修改效能遠遠大於檢索效能時,不應該建立索引。這是因為,修改效能和檢索效能是互相矛盾的。當增加索引時,會提高檢索效能,但是會降低修改效能。當減少索引時,會提高修改效能,降低檢索效能。因此,當修改效能遠遠大於檢索效能時,不應該建立索引。

如果條件中有or,即使其中有條件帶索引也不會使用(這也是為什麼盡量少用or的原因)。注意:要想使用or,又想讓索引生效,只能將or條件中的每個列都加上索引

對於多列索引,不是使用的第一部分,則不會使用索引(即不符合最左字首原則)

like查詢是以%開頭

如果列型別是字串,那一定要在條件中將資料使用引號引用起來,否則不使用索引

如果mysql估計使用全表掃瞄要比使用索引快,則不使用索引

此外,檢視索引的使用情況

handler_read_rnd_next:這個值越高,說明查詢低效

並非所有的資料庫都以相同的方式使用索引。作為通用規則,只有當經常查詢索引列中的資料時,才需要在表上建立索引。索引占用磁碟空間,並且降低新增、刪除和更新行的速度。如果應用程式非常頻繁地更新資料或磁碟空間有限,則可能需要限制索引的數量。在表較大時再建立索引,表中的資料越多,索引的優越性越明顯。

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

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

確定索引的有效性:

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

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

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

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

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

今天先弄到這兒。明兒晚有空補上最左字首原則和b樹索引說明。

資料庫mysql索引 資料庫 mysql索引

mysql 索引 mysql索引的建立對於mysql的高效執行是很重要的,索引可以大大提高mysql的檢索速度。打個比方,如果合理的設計且使用索引的mysql是一輛蘭博基尼的話,那麼沒有設計和使用索引的mysql就是乙個人力三輪車。索引分單列索引和組合索引。單列索引,即乙個索引只包含單個列,乙個表可...

資料庫 mysql 索引學習記錄

mysql 索引學習記錄 by james 1 mysql索引的型別 在mysql 中,主要有四種型別的索引,分別為 b tree 索引,hash 索引,fulltext 索引和rtree 其中hash索引在對待聯合索引的處理上有點特別 比如乙個name和email列的聯合索引,在innodb,my...

MySQL學習 資料庫的索引

1 為什麼要建立索引 索引會增加資料庫的查詢速度,資料庫在執行命令時,會預設根據搜尋條件進行全表掃瞄。如果有索引,查詢時就會先去索引列表查詢,大大減少遍歷次數,所以能明顯增加查詢的速度。2 索引的建立 create index nameindex on user username 單索引 creat...