MySQL 索引優化 btree hash rtree

1、MySQL索引類型node

mysql裏目前只支持4種索引分別是:full-text,b-tree,hash,r-treemysql

b-tree索引應該是mysql裏最普遍的索引的了,除了archive基本全部的存儲引擎都支持它.linux

1. full-text索引sql

full-text在mysql裏僅有myisam支持它,並且支持full-text的字段只有char、varchar、text數據類型。緩存

full-text主要是用來代替like "%***%"效率低下的問題服務器

2. b-tree索引函數

b-tree在myisam裏的形式和innodb稍有不一樣spa

在 innodb裏,有兩種形態:一是primary key形態,其leaf node裏存放的是數據,並且不只存放了索引鍵的數據,還存放了其餘字段的數據。二是secondary index,其leaf node和普通的b-tree差很少,只是還存放了指向主鍵的信息.排序

而在myisam裏,主鍵和其餘的並無太大區別。不過和innodb不太同樣的地方是在myisam裏,leaf node裏存放的不是主鍵的信息,而是指向數據文件裏的對應數據行的信息.索引

3. hash索引

目前我所知道的就只有memory和ndb cluster支持這種索引.

hash索引因爲其結構,因此在每次查詢的時候直接一次到位,不像b-tree那樣一點點的前進。因此hash索引的效率高於b-tree,但hash也有缺點,主要以下:

(1)因爲存放的是hash值,因此僅支持<=>以及in操做.

(2)hash索引沒法經過操做索引來排序,這是由於存放的時候通過hash計算,可是計算的hash值和存放的不必定相等,因此沒法排序.

(3)在組合因此裏,沒法對部分使用索引.

(4)不能避免全表掃描,只是因爲在memory表裏支持非惟一值hash索引,www.linuxidc.com就是不一樣的索引鍵,可能存在相同的hash值.

(5)當存在大量相同hash值得時候,hash索引的效率會變低.

4. r-tree索引

r-tree在mysql不多使用,僅支持geometry數據類型,支持該類型的存儲引擎只有myisam、bdb、innodb、ndb、archive幾種。

相對於b-tree,r-tree的優點在於範圍查找.

2、mysql裏sql語句值得注意的地方

1. myisam裏全部鍵的長度僅支持1000字節,innodb是767.

2. blob和text字段僅支持前綴索引.

3. 使用!=以及<>不等於的時候,mysql不使用索引.

4. 當在字段時候函數的時候,mysql沒法使用索引;在join時條件字段類型不一致的時候,mysql沒法使用索引;在組合索引裏使用非第一個索引時也不使用索引.

5. 在使用like的時候,以%開頭,即"%***"的時候沒法使用索引;在使用or的時候,要求or先後字段都有索引.

有時候mysql query optimizer會認爲使用索引並非最優計劃,因此不使用索引。能夠在sql語句裏能夠用use,force index,固然有時候使用也不會比不用快,因此須要忽略掉index方法是ignore index.

關閉查詢緩存sql_no_cache

select sql_no_cache * from table_name;

這樣可讓一些不多使用的語句不放在緩存裏,查找的時候不會去緩存裏找;對應的是強制緩存sql_cache

select sql_cache * from table_name;

另外,在my.cnf中若是設置query_cache_type=2的話,那麼只有在使用sql_cache後纔會使用緩存;

還有mysql裏的優先操做hight_priority讓mysql優先操做這個語句

select high_priority * fromtable_name;

與其對應的是low_priority;

mysql裏還有延時插入insert delayed

insert delayed into table_name....; 

#當提交以後,mysql返回ok,但不當即插入,而是當mysql有空再插入。假如等待時服務器崩潰,那麼全部數據丟失,而且插入不會返回自增id.

3、幾個技巧

1. 強制鏈接順序: STRAIGHT_JOIN

SELECT TABLE1.FIELD1, TABLE2.FIELD2 FROM TABLE1 STRAIGHT_JOIN TABLE2 WHERE …

由上面的SQL語句可知,經過STRAIGHT_JOIN強迫MySQL按TABLE一、TABLE2的順序鏈接表。若是你認爲按本身的順序比MySQL推薦的順序進行鏈接的效率高的話,就能夠經過STRAIGHT_JOIN來肯定鏈接順序。

2. 強制使用臨時表: SQL_BUFFER_RESULT

SELECT SQL_BUFFER_RESULT * FROM TABLE1 WHERE …

當咱們查詢的結果集中的數據比較多時,能夠經過SQL_BUFFER_RESULT,選項強制將結果集放到臨時表中,這樣就能夠很快地釋放MySQL的表鎖(這樣其它的SQL語句就能夠對這些記錄進行查詢了),而且能夠長時間地爲客戶端提供大記錄集。

3. 分組使用臨時表 SQL_BIG_RESULT和SQL_SMALL_RESULT

SELECT SQL_BUFFER_RESULT FIELD1, COUNT(*) FROM TABLE1 GROUP BY FIELD1;

通常用於分組或DISTINCT關鍵字,這個選項通知MySQL,若是有必要,就將查詢結果放到臨時表中,甚至在臨時表中進行排序。SQL_SMALL_RESULT比起SQL_BIG_RESULT差很少,不多使用。

相關文章
相關標籤/搜索