首先查看sql执行计划,确定执行过程是否用到索引,是否全表扫描等
例:explain select * from servers
1:子查询,in 和 exists的区别: in主要先执行内查询后与外表比较,exists先查询外表后与内表比较判断是否满足条件,具体查询效率取决于查询条件内表数据与外表数据大小,以及查询条件是否包含索引.
2:not in ,is not null等非判断会导致索引失效,扫描全表
3:条件中用or,即使其中有条件带索引,也不会使用索引查询,除非or前后所有字段全部带索引
4;对于多列索引,不是使用的第一部分,则不会使用索引。
5:like的模糊查询以%开头,索引失效
6:如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不会使用索引
7:如果表内容较小,不使用索引反而更快..
8:不使用ORDER BY RAND(),因为这样会导致数据列被多次扫描
例如:select id from `table_name` order by rand() limit 1000;
可以优化为select id from `table_name` t1 join (select rand()*(select max(id) from `table_name`) as nid) t2 on t1.id>t2.nid limit 1000;
9:分页查询.随着表空间数据的增加,limit分页查询会越来越慢,优化方案是提前获取,前一页最大行数,
例如:select id from `table_name` id>80000 limit 20;
10:分段查询,在一些查询过程中,查询条件范围过大,会导致查询缓慢,主要原因是扫描行数过多,这个时候可以分段查询,循环遍历然后合并结果集.
11:where 判断中避免出现null,因为null会导致查询放弃索引进行全表扫描.
12:like模糊查询出现%name%查询时,name字段添加索引但是不起作用,这时候需要使用全文索引,需要注意全文索引查询sql与普通索引查询语句的区别
select id from `table_name` where name like '%zhang%';
使用全文索引
select id from `table_name` where match(name) against('zhang' in boolean mode);
13:避免在where 子句中使用表达式操作,这会导致引擎放弃索引.
14:避免where子句中出现,column字段的类型与传入参数类型不一致出现的类型转换.
15:联合索引遵守最左前缀法则,常用的查询字段要放最前面,索引顺序很重要
16:特殊情况使用force index强制选择查询走指定索引.
17:范围查询,比如between,<,>等条件会导致后边的索引字段失效.