欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MySQL---优化是否存在?

程序员文章站 2022-03-23 19:07:09
看到公众号推了一篇关于优化MySQL是否存在问题的文章,感觉能把之前的东西都串起来,就想着记现在的所思所想。MySQL的语句执行顺序众所周知,MySQL的执行语句如下所示:from子句join子句on子句where子句group by子句avg sum count max minhaving子句select子句order by子句limit子句问题描述当需要根据一个条件或多个条件查询是否存在记录,不关心多少条记录时,常用的SQL语句如下所示SELECT count(*) F...

看到公众号推了一篇关于优化MySQL是否存在问题的文章,感觉能把之前的东西都串起来,就想着记现在的所思所想。

MySQL的语句执行顺序

众所周知,MySQL的执行语句如下所示:

  1. from子句
  2. join子句
  3. on子句
  4. where子句
  5. group by子句
  6. avg sum count max min
  7. having子句
  8. select子句
  9. order by子句
  10. limit子句

问题描述

当需要根据一个条件或多个条件查询是否存在记录,不关心多少条记录时,常用的SQL语句如下所示

SELECT count(*) FROM table WHERE a=1 AND b=2

很明显可以优化(根据覆盖索引,如果存在覆盖a和b的索引,则不需要回表了)

SELECT count(1) FROM table WHERE a=1 AND b=2

还可以优化

SELECT 1 FROM table WHERE a=1 AND b=2 LIMIT 1

根据上面的介绍可知,limit子句最后执行,为什么可以优化查询过程呢?
首先from子句会先生成一张虚拟表(不是临时表,由于查询优化器的存在,优化器会选择自己认为最好的执行顺序新建这张虚拟表,换句话说建虚拟表的过程无论如何都会有,只不过索引的存在可以让建立虚拟表的过程加快),然后select 1 … limit 1相较于 select count(1) 省去了遍历虚拟表的过程。就像循环中的见到第一条数据就返回。

本文地址:https://blog.csdn.net/weixin_41904840/article/details/107304613