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