mysql 索引優化 btree hash rtree

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

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

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

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

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

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

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

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

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

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

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

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

3.full-text索引

full-text在mysql裏僅有myisam支持它,並且支持full-text的字段只有char,varchar,以及text數據類型,full-text主要是用來代替like "%***%"效率低下的問題的.

4.r-tree索引

r-tree在mysql不多使用,僅支持geometry數據類型,支持該類型的存儲引擎只有myisam,bdb,innodb,ndb,archive幾種.相對於b-tree,r-tree的優點在於範圍查找.

二: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.

再轉幾個技巧:

強制鏈接順序 STRAIGHT_JOIN

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

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

強制使用臨時表 SQL_BUFFER_RESULT

SELECT SQL_BUFFER_RESULT * FROM TABLE1 WHERE …

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

分組使用臨時表 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差很少,不多使用。

相關文章
相關標籤/搜索