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