1. 程式人生 > >深度解析mysql優化手段,輕鬆解決千萬級資料量操作

深度解析mysql優化手段,輕鬆解決千萬級資料量操作

ALTER TABLE mytable ADD INDEX name_city_age (name(10),city,age);[code]
建表時,usernname長度為 16,這裡用 10。這是因為一般情況下名字的長度不會超過10,這樣會加速索引查詢速度,還會減少索引檔案的大小,提高INSERT的更新速度。

如果分別在 usernname,city,age上建立單列索引,讓該表有3個單列索引,查詢時和上述的組合索引效率也會大不一樣,遠遠低於我們的組合索引。雖然此時有了三個索引,但MySQL只能用到其中的那個它認為似乎是最有效率的單列索引。

建立這樣的組合索引,其實是相當於分別建立了下面三組組合索引:

usernname,city,age   usernname,city   usernname  為什麼沒有 city,age這樣的組合索引呢?這是因為MySQL組合索引“最左字首”的結果。簡單的理解就是隻從最左面的開始組合。並不是只要包含這三列的查詢都會用到該組合索引,下面的幾個SQL就會用到這個組合索引:
[code]
SELECT * FROM mytable WHREE username="admin" AND city="鄭州"  SELECT * FROM mytable WHREE username="admin"

6.建立索引的時機

到這裡我們已經學會了建立索引,那麼我們需要在什麼情況下建立索引呢?一般來說,在WHERE和JOIN中出現的列需要建立索引,但也不完全如此,因為MySQL只對<,<=,=,>,>=,BETWEEN,IN,以及某些時候的LIKE才會使用索引。例如:

複製程式碼程式碼如下: SELECT t.Name  FROM mytable t LEFT JOIN mytable m    ON t.Name=m.username WHERE m.age=20 AND m.city='鄭州'

此時就需要對city和age建立索引,由於mytable表的userame也出現在了JOIN子句中,也有對它建立索引的必要。

剛才提到只有某些時候的LIKE才需建立索引。因為在以萬用字元%和_開頭作查詢時,MySQL不會使用索引。例如下句會使用索引:

複製程式碼程式碼如下:
SELECT * FROM mytable WHERE username like'admin%'
而下句就不會使用:

複製程式碼程式碼如下: SELECT * FROM mytable WHEREt Name like'%admin'

3.利用查詢快取,優化查詢速度