索引是一種將資料庫中單列或者多列的值進行排序的結構。應用索引能夠大幅度提高查詢的速度,降低伺服器的負載。mysql中應用索引可以提高檢索且可以提高系統的整體效能,但建立與維護索引需要耗費時間,並且耗費的時間與資料量的大小成正比,另外,索引需要占用物理空間,給資料的維護造成很多麻煩。
不同的儲存引擎定義了每個表的最大索引數和最大索引長度。所有儲存引擎對每個表至少支援16個索引,總索引長度至少為256個位元組。有些索引支援更多的索引數和更大的索引長度。索引共有兩種儲存型別,包括b樹(btree)索引和雜湊(hash)索引。b樹為系統預設索引方法。
普通索引。即不應用任何限制條件的索引,該索引可以在任何資料型別中建立。字段本身的約束條件可以判斷其值是否為空或者唯一。
唯一索引。使用unique引數可以設定唯一索引。建立該索引時,索引的值必須唯一,通過唯一索引,使用者可以快速定位某一條記錄,主鍵是一種特殊索引。
全文索引。使用fulltext引數可以設定索引為全文索引,全文索引只能建立在char、varchar或者text型別的字段上。查詢資料量較大的字串型別的字段時,使用它可以提高查詢速度。在預設情況下,應用全文搜尋大小寫不敏感。如果索引的列使用二進位制排序後,可以執行大小寫敏感的全文索引。
單列索引。單列索引只對應乙個欄位的索引,可以包括上述的三種索引方式,應用該索引的條件只需要保證該索引值對應乙個字段即可。
多列索引。多列索引是在表的多個欄位上建立乙個索引。該索引指向建立時對應的多個字段,使用者可以通過這幾個字段進行查詢。想要應用該索引,使用者必須使用這些欄位的第乙個字段。
空間索引。使用spatial引數可以設定索引為空間索引。空間索引只能建立在空間資料型別上,這樣可以提高系統獲取空間資料的效率。mysql中只有myisam儲存引擎支援空間引擎,且索引的字段不能為空。
drop index index_name on table_name;
mysql的使用規範
最左字首匹配原則,資料庫會一直向右匹配直到遇到範圍查詢就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)順序的索引,d是用不到索引的;
=和in可以亂序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意順序;
盡量選擇區分度高的列作為索引,區分度的公式是count(distinct col)/count(*),表示欄位不重複的比例,比例越大我們掃瞄的記錄數越少,唯一鍵的區分度是1,而一些狀態、性別字段可能在大資料面前區分度就是0,所以最好別對這些字段建立索引;
索引列不能參與計算,保持列「乾淨」,因為b+樹中存的都是資料表中的字段值,但進行檢索的時候,需要把所有元素都應用函式才能比較,顯然成本太大;
盡量的擴充套件索引,不要新建索引。比如表中已經有a的索引,現在要加(a,b)的索引,那麼只需要修改原來的索引即可;
索引要建立在查詢頻繁的字段上。這是因為,如果這些列很少用到,那麼有無索引並不能明顯改變查詢速度。相反,由於增加了索引,反而降低了系統的維護速度和增大了空間需求。
應盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃瞄; 例子:select id from t where num is null
應盡量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃瞄;
應盡量避免在 where 子句中使用 or 來連線條件,否則將導致引擎放棄使用索引而進行全表掃瞄;(可以使用union來代替or)
in 和 not in 也要慎用,因為in會使系統無法使用索引,而只能直接搜尋表中的資料,對於連續的數值,能用 between 就不要用 in;
盡量避免在索引過的字元資料中,使用非打頭字母搜尋,這也使得引擎無法利用索引; 比如:select * from t1 where name like 『%l%』
應盡量避免在 where 子句中對字段進行表示式操作或者函式操作,都會導致引擎放棄使用索引而進行全表掃瞄; 比如:select * from t1 where substing(name,2,1)=』l』
索引的分類和 建立索引
索引的分類和 建立索引 簡單介紹下 單值索引 即乙個索引只包含單個列 乙個表可以有多個單值索引 一張表的單值索引 最好不超過 5個 唯一索引 即 索引列的值 必須為一 但是可以有空值 復合索引 即 乙個 索引包含多個列 建立索引 create unique index indexname on my...
mysql索引的分類
根據索引的儲存方式分類 1.b 樹索引 目前大部分的索引都是採用 b 樹索引來儲存的,如 innodb 元件 葉子節點 包含的條目直接指向表裡的資料行。葉子節點之間彼此相連,乙個葉子節點有乙個指向下乙個葉子節點的指標。分支節點 包含的條目指向索引裡其他的分支節點或者葉子節點。根節點 乙個 b 樹索引...
mysql的索引分類
1.主鍵索引 不能重複,只有乙個 alter table table name add primary key column 2.唯一索引 類似主鍵,列不能重複 alter table table name add unique column 3.普通索引 alter table table nam...