mysql执行疑惑,为什么执行4条sql比执行1条还快。
大家讲道理
大家讲道理 2017-04-17 13:35:20
[MySQL讨论组]

今天晚上突然发现执行4条sql比执行1条还快,也就是说执行多条单条语句在一定条件下执行效率也是不错的。

4条sql语句如下:
customer是生意关系表,store_idcustomer_id都是店铺的id,有索引。store是店铺表,id是自增主键。我的数据库引擎是MyISAM.

SELECT * FROM customer WHERE store_id=2 AND customer_id=8;

SELECT * FROM customer WHERE store_id=8 AND customer_id=2;

SELECT * FROM store WHERE id=2;

SELECT * FROM store WHERE id=8;

修改成1条sql语句

SELECT 
  COUNT(id) 
FROM
  store 
WHERE id IN 
  (SELECT 
    customer_id 
  FROM
    customer 
  WHERE (store_id = 2 
      AND customer_id = 8) 
    OR (store_id = 8 
      AND customer_id = 2)) ;

问题就出现了:执行四条语句需要0.004s,而执行下面的一条sql需要0.80s,也就是说分别执行4条语句是执行一条语句的快了将近20倍。

我的思考

然后我尝试把单条的sql语句拆成两条,先执行括号内的,发现只需要0.001s,然后执行带in的单条语句,也只需要0.001s,为什么组合起来的时候会出现如此大的差距。然后我根据Profiler进行分析,发现Sending dataexecuting这两天占用时间比较长。

求证

  1. 是不是在某些条件下,多次执行简单sql语句效率确实比写一条复杂sql语句执行效率高,

  2. 上面为什么会出现这种情况,是不是sql语句的书写问题。请大神不吝指出,谢谢。

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全部回复(2)
迷茫

正常情況來說, sql 語句的邏輯越多執行肯定越慢, 相對一條條的執行. 不過也不盡然如此, 你多條語句執行就多一次 io 可能在大批量的查詢就導致性能比一次執行來的慢.

從你給出的一條語句查詢來看, 耗時因該都在 in 的操作中, in 會導致全表掃描, 效率相對較低
嘗試使用 join 來替代 in

select count(s.id) as c from store as s
right join (
select customer_id from customer
where (store_id=2 and customer_id=8)
or (store_id=8 and customer_id=2)
) as cj on s.id=cj.customer_id
迷茫

MySQL的执行效率只和具体操作有关,和条数有毛线关系。
相同的操作,理论上也是一条语句更快,不用怀疑。

问题就在于这里的IN。
推荐使用Left Join来取代IN,会更有效率。

我直接解释你的思考那里吧:
先执行括号内的,store_id和customer_id都是有索引的,必然很快。
执行带IN的单条语句,数据库会解释成Where id=…… And id=…… And id=……的效果,还是会用到store里的索引。

组合起来为什么就变慢:
子查询的Select生成了一个类似临时表的东西,这里面是没有索引的!
貌似在某些数据库里,IN里面的子查询会在循环的时候执行多次?
不大清楚。。。

总之,尽量不要用IN就对了!

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号