一: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差很少,不多使用。