MySQL优化的12条建议(第二篇)

8,不使用ORDER BY RAND()

    select id from `dynamic` order by rand() limit 1000;

上面的SQL语句,可优化为:

select id from `dynamic` t1 join (select rand() * (select max(id) from `dynamic`) as nid) t2 on t1.id > t2.nid limit 1000;

9、区分in和exists、not in和not exists

区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询。所以IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。

关于not in和not exists,推荐使用not exists,不仅仅是效率问题,not in可能存在逻辑问题。如何高效的写出一个替代not exists的SQL语句?

  原SQL语句:

  select colname … from A表 where a.id not in (select b.id from B表)

  优化后的SQL语句

    select colname … from A表 Left join B表 on where a.id = b.id where b.id is null

10、使用合理的分页方式以提高分页的效率

  原SQL语句:

      select id,name from  product  limit  866613, 20

使用上述SQL语句做分页的时候,可能有人会发现,随着表数据量的增加,直接使用limit分页查询会越来越慢。

优化的方法如下:可以取前一页的最大行数的id,然后根据这个最大的id来限制下一页的起点。比如此列中,上一页最大的id是866612。SQL可以采用如下的写法:

优化后的SQL语句

select id,name from product where id> 866612 limit 20

11、避免在where子句中对字段进行null值判断

          对NULL进行判断的话会导致数据库引擎放弃使用索引而进行全表扫描

12、避免在where子句中对字段进行表达式操作

              select user_id, from user_base where age*2=36;

发布了5 篇原创文章 · 获赞 3 · 访问量 3974

猜你喜欢

转载自blog.csdn.net/Alex_Cxl/article/details/89099410