MySQL---优化是否存在?
程序员文章站
2022-07-06 10:53:31
看到公众号推了一篇关于优化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的执行语句如下所示:
- from子句
- join子句
- on子句
- where子句
- group by子句
- avg sum count max min
- having子句
- select子句
- order by子句
- 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