mysql 查詢優化 (一)索引分類

2021-09-01 01:17:03 字數 2860 閱讀 8379

一,索引分類

普通索引、唯一索引和主索引

1. 普通索引

普通索引(由關鍵字key或index定義的索引)的唯一任務是加快對資料的訪問速度。因此,應該只為那些最經常出現在查詢條件(where column = …)或排序條件(order by column)中的資料列建立索引。只要有可能,就應該選擇乙個資料最整齊、最緊湊的資料列(如乙個整數型別的資料列)來建立索引。

2. 唯一索引

普通索引允許被索引的資料列包含重複的值。比如說,因為人有可能同名,所以同乙個姓名在同乙個」員工個人資料」資料表裡可能出現兩次或更多次。

如果能確定某個資料列將只包含彼此各不相同的值,在為這個資料列建立索引的時候就應該用關鍵字unique把它定義為乙個唯一索引。這麼做的好處:一是簡化了mysql對這個索引的管理工作,這個索引也因此而變得更有效率;二是mysql會在有新記錄插入資料表時,自動檢查新記錄的這個欄位的值是否已經在某個記錄的這個欄位裡出現過了;如果是,mysql將拒絕插入那條新記錄。也就是說,唯一索引可以保證資料記錄的唯一性。事實上,在許多場合,人們建立唯一索引的目的往往不是為了提高訪問速度,而只是為了避免資料出現重複。

3. 主索引

在前面已經反覆多次強調過:必須為主鍵欄位建立乙個索引,這個索引就是所謂的」主索引」。主索引與唯一索引的唯一區別是:前者在定義時使用的關鍵字是primary而不是unique。

4. 外來鍵索引

如果為某個外來鍵字段定義了乙個外來鍵約束條件,mysql就會定義乙個內部索引來幫助自己以最有效率的方式去管理和使用外來鍵約束條件。

5. 復合索引

索引可以覆蓋多個資料列,如像index(columna, columnb)索引。這種索引的特點是mysql可以有選擇地使用乙個這樣的索引。如果查詢操作只需要用到columna資料列上的乙個索引,就可以使用復合索引index(columna, columnb)。不過,這種用法僅適用於在復合索引中排列在前的資料列組合。比如說,index(a, b, c)可以當做a或(a, b)的索引來使用,但不能當做b、c或(b, c)的索引來使用。

6,全文索引

文字欄位上的普通索引只能加快對出現在字段內容最前面的字串(也就是字段內容開頭的字元)進行檢索操作。如果欄位裡存放的是由幾個、甚至是多個單詞構成的較大段文字,普通索引就沒什麼作用了。這種檢索往往以like %word%的形式出現,這對mysql來說很複雜,如果需要處理的資料量很大,響應時間就會很長。

這類場合正是全文索引(full-text index)可以大顯身手的地方。在生成這種型別的索引時,mysql將把在文字中出現的所有單詞建立為乙份清單,查詢操作將根據這份清單去檢索有關的資料記錄。全文索引即可以隨資料表一同建立,也可以等日後有必要時再使用下面這條命令新增:alter table tablename add fulltext(column1, column2) 有了全文索引,就可以用select查詢命令去檢索那些包含著乙個或多個給定單詞的資料記錄了。

下面是這類查詢命令的基本語法:

select * from tablename where match(column1, column2) against(』word1′, 『word2′, 『word3′)

上面這條命令將把column1和column2欄位裡有word1、word2和word3的資料記錄全部查詢出來。

註解:innodb資料表不支援全文索引。

二,使用索引的限制

如果wehere子句的查詢條件裡有不等號(where coloum != …),mysql將無法使用索引。

類似地,如果where子句的查詢條件裡使用了函式(where day(column) = …),mysql也將無法使用索引。

在join操作中(需要從多個資料表提取資料時),mysql只有在主鍵和外來鍵的資料型別相同時才能使用索引。

如果where子句的查詢條件裡使用比較操作符like和regexp,mysql只有在搜尋模板的第乙個字元不是萬用字元的情況下才能使用索引。比如說,如果查詢條件是like 『abc%』,mysql將使用索引;如果查詢條件是like 『%abc』,mysql將不使用索引。

在order by操作中,mysql只有在排序條件不是乙個查詢條件表示式的情況下才使用索引。(雖然如此,在涉及多個資料表查詢裡,即使有索引可用,那些索引在加快order by方面也沒什麼作用)

如果某個資料列裡包含許多重複的值,就算為它建立了索引也不會有很好的效果。比如說,如果某個資料列裡包含的淨是些諸如」0/1″或」y/n」等值,就沒有必要為它建立乙個索引。

四,sql語句分析 工具 explain命令

在explain命令的輸出結果裡,第1列是從資料庫讀取的資料表的名字,它們按被讀取的先後順序排列。type列指定了本資料表與其它資料表之間的關聯關係(join)。在各種型別的關聯關係當中,效率最高的是system,然後依次是const、eq_ref、ref、range、index和 all(all的意思是:對應於上一級資料表裡的每一條記錄,這個資料表裡的所有記錄都必須被讀取一遍–這種情況往往可以用一索引來避免)。

possible_keys資料列給出了mysql在搜尋資料記錄時可選用的各個索引。key資料列是mysql實際選用的索引,這個索引按位元組計算的長度在key_len資料列裡給出。比如說,對於乙個integer資料列的索引,這個位元組長度將是4。如果用到了復合索引,在key_len資料列裡還可以看到mysql具體使用了它的哪些部分。作為一般規律,key_len資料列裡的值越小越好(意思是更快)。

ref資料列給出了關聯關係中另乙個資料表裡的資料列的名字。row資料列是mysql在執行這個查詢時預計會從這個資料表裡讀出的資料行的個數。row資料列裡的所有數字的乘積可以讓我們大致了解這個查詢需要處理多少組合。

最後,extra資料列提供了與join操作有關的更多資訊,比如說,如果mysql在執行這個查詢時必須建立乙個臨時資料表,就會在extra列看到using temporary字樣。

五,實際測試例子

有時間把幾個測試例子貼上

MySQL查詢優化之 index 索引的分類和使用

唯一索引 unique key 常規索引 key index 全文索引 fulltext 基礎語法 方法一 建立表時 create table 表名 欄位名1 資料型別 完整性約束條件 欄位名2 資料型別 完整性約束條件 unique fulltext spatial index key 索引名 欄...

MySQL查詢優化之 index 索引的分類和使用

唯一索引 unique key 常規索引 key index 全文索引 fulltext 基礎語法 方法一 建立表時 create table 表名 欄位名1 資料型別 完整性約束條件 欄位名2 資料型別 完整性約束條件 unique fulltext spatial index key 索引名 欄...

MySQL 索引與查詢優化

本文介紹一些優化 mysql 索引設計和查詢的建議。在進行優化工作前,請務必了解mysql explain命令 檢視執行計畫 索引在邏輯上是指從索引列 關鍵字 到資料的對映,通過索引可以快速的由關鍵字查詢到資料記錄。順序查詢複雜度為o n 樹狀索引查詢複雜度為o logn 雜湊索引為o 1 mysq...