针对mysql查询时反应慢问题,可以在select上做些修改
1 尽量少使用null在where语句中,这样会导致引擎放弃使用索引而进行全表扫描
比如 select id from table where num is null;
可以改成 select id from table where num=0;
2 在where语句中少使用or连接,这样会导致引擎放弃使用索引而进行全表扫描,
比如 select id from table where num=10 or num=20;
可以使用 select id from table where num=10 union select id from table where num=20;
in 和not in也要慎用
比如 select id from table where num in (1,2,3);
连续的数值就可以改成 select id from table where num between 1 and 3;
3 如果在 where 子句中使用参数,也会导致全表扫描。因为 SQL 只有在运行时才会解析局部变量,但优 化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项,
比如 select id from table where num=@num;
可以修改为强制查询使用索引 select id from table with (index(索引名)) where num=@num;
4 尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。
比如 select id from table where num/2=100;
可以修改成 select id from table where num=100*2;
5 尽量避免在 where 子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。
比如 select id from table where substring(name,1,3)=‘abc‘;#name
以 abc 开头的 id应改为:
select id from table where name like ‘abc%‘;
6 可以使用exists代替in
比如 select num from table where num in(select num from b);
可以修改成 select num from table where exists(select 1 from b where num=a.numm);
7 尽量少用全局 * 这样会致使引擎全表扫描
原文:http://boking.blog.51cto.com/8080748/1625696