1. 程式人生 > >mysql索引總結----mysql 索引型別以及建立

mysql索引總結----mysql 索引型別以及建立

文章歸屬:http://feiyan.info/16.html

關於MySQL索引的好處,如果正確合理設計並且使用索引的mysql是一輛蘭博基尼的話,那麼沒有設計和使用索引的MySQL就是一個人力三輪車。對於沒有索引的表,單表查詢可能幾十萬資料就是瓶頸,而通常大型網站單日就可能會產生幾十萬甚至幾百萬的資料,沒有索引查詢會變的非常緩慢。還是以WordPress來說,其多個數據表都會對經常被查詢的欄位新增索引,比如wp_comments表中針對5個欄位設計了BTREE索引。

一個簡單的對比測試

以我去年測試的資料作為一個簡單示例,20多條資料來源隨機生成200萬條資料,平均每條資料來源都重複大概10萬次,表結構比較簡單,僅包含一個自增ID,一個char型別,一個text型別和一個int型別,單表2G大小,使用MyIASM引擎。開始測試未新增任何索引。

執行下面的SQL語句:

1 mysql> SELECT id,FROM_UNIXTIME(timeFROM article WHERE a.title='測試標題'

查詢需要的時間非常恐怖的,如果加上聯合查詢和其他一些約束條件,資料庫會瘋狂的消耗記憶體,並且會影響前端程式的執行。這時給title欄位新增一個BTREE索引:

1 mysql> ALTER TABLE article ADD INDEX index_article_title ON title(200);

再次執行上述查詢語句,其對比非常明顯:

MySQL索引的概念

索引是一種特殊的檔案(InnoDB資料表上的索引是表空間的一個組成部分),它們包含著對資料表裡所有記錄的引用指標。更通俗的說,資料庫索引好比是一本書前面的目錄,能加快資料庫的查詢速度。上述SQL語句,在沒有索引的情況下,資料庫會遍歷全部200條資料後選擇符合條件的;而有了相應的索引之後,資料庫會直接在索引中查詢符合條件的選項。如果我們把SQL語句換成“SELECT * FROM article WHERE id=2000000”,那麼你是希望資料庫按照順序讀取完200萬行資料以後給你結果還是直接在索引中定位呢?上面的兩個圖片鮮明的用時對比已經給出了答案(注:一般資料庫預設都會為主鍵生成索引)。

索引分為聚簇索引和非聚簇索引兩種,聚簇索引是按照資料存放的物理位置為順序的,而非聚簇索引就不一樣了;聚簇索引能提高多行檢索的速度,而非聚簇索引對於單行的檢索很快。

MySQL索引的型別

1. 普通索引

這是最基本的索引,它沒有任何限制,比如上文中為title欄位建立的索引就是一個普通索引,MyIASM中預設的BTREE型別的索引,也是我們大多數情況下用到的索引。

01 –直接建立索引
02 CREATE INDEX index_name ON table(column(length))
03 –修改表結構的方式新增索引
04 ALTER TABLE table_name ADD INDEX index_name ON (column(length))
05 –建立表的時候同時建立索引
06 CREATE TABLE `table` (
07 `id` int(11) NOT NULL AUTO_INCREMENT ,