mysql裏sql語句值得注意的地方mysql
1. myisam裏全部鍵的長度僅支持1000字節,innodb是767.sql
2. blob和text字段僅支持前綴索引.緩存
3. 使用!=以及<>不等於的時候,mysql不使用索引.服務器
4. 當在字段時候函數的時候,mysql沒法使用索引;在join時條件字段類型不一致的時候,mysql沒法使用索引;在組合索引裏使用非第一個索引時也不使用索引.函數
5. 在使用like的時候,以%開頭,即"%***"的時候沒法使用索引;在使用or的時候,要求or先後字段都有索引.spa
有時候mysql query optimizer會認爲使用索引並非最優計劃,因此不使用索引。能夠在sql語句裏能夠用use,force index,固然有時候使用也不會比不用快,因此須要忽略掉index方法是ignore index.排序
關閉查詢緩存sql_no_cache索引
select sql_no_cache * from table_name;it
這樣可讓一些不多使用的語句不放在緩存裏,查找的時候不會去緩存裏找;對應的是強制緩存sql_cacheio
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差很少,不多使用。