如何书写高效的MySQL查询?

时间:2021-11-17 01:03:11

WHERE子句中的书写注意事项

  • 首先应考虑在 where 及 order by 涉及的列上建立索引。

  • 下列操作会导致引擎放弃使用索引而进行全表扫描,是应尽量避免的。
    • 1).在where 子句中使用!=<>操作符

    • 2).在where子句中对字段进行null值判断
      如:

      select id from t where num is null;

      可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:

      select id from t where num=0;
    • 3).在where子句中使用 or 来连接条件
      如:

      select id from t where num=10 or num=20;

      可以这样查询:

      select id from t where num=10
      union all
      select id from t where num=20;
    • 4).in 和 not in 也要慎用
      如:

      select id from t where num in(1,2,3);

      对于连续的数值,能用between就不要用in
      如:

      select id from t where num between 1 and 3;

      很多时候可以用exists代替in
      如:

      select num from a where num in(select num from b);

      用下面的语句替换:

      select num from a where exists(select 1 from b where num=a.num);
    • 5).在where子句中使用参数
      因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时,它必须在编译时进行选择。
      如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。
      如下面语句将进行全表扫描:

      select id from t where [email protected];

      可以改为强制查询使用索引:

      select id from t with(index(索引名)) where [email protected]
    • 6).在where子句中对字段进行函数、算术运算或其他表达式运算
      如:

      select id from t where num/2=100;
      select id from t where date(createdate)>='2016-07-01';

      应改为:

      select id from t where num=100*2
      select id from t where createdate>='2005-11-30 00:00:00';

模糊查询(like)时需要注意的事项

  • 左右都需要模糊匹配时,会导致全表扫描;

    select id from t where tablename like '