看到公众号推了一篇关于优化MySQL是否存在问题的文章,感觉能把之前的东西都串起来,就想着记现在的所思所想。
众所周知,MySQL的执行语句如下所示:
当需要根据一个条件或多个条件查询是否存在记录,不关心多少条记录时,常用的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
如对本文有疑问, 点击进行留言回复!!
网友评论