MySQL 分页查询性能比较

2017-04-01 10:14:43 +08:00
 zioc

请问这两种写法哪一种好呢?

SELECT * FROM API_LOG a JOIN (select ID from API_LOG LIMIT 0, 10) b ON a.ID = b.ID

SELECT * FROM API_LOG WHERE ID IN ( SELECT * FROM (SELECT ID FROM API_LOG LIMIT 0, 10) t)

5298 次点击
所在节点    MySQL
24 条回复
8355
2017-04-01 10:19:20 +08:00
没太看懂你写的 sql
不过问性能来说你运行一下就知道了啊.
AlisaDestiny
2017-04-01 10:19:31 +08:00
这个你可以自己测下的。表里插入 1W 假数据。每个 sql 语句执行十次。看平均时间。
killerv
2017-04-01 10:22:25 +08:00
mysql 子查询比较坑,慎重使用。
zioc
2017-04-01 10:29:31 +08:00
@killerv 确实
@8355
@AlisaDestiny
测了 第一种快很多
8355
2017-04-01 10:32:38 +08:00
@zioc #4 可我觉得 join 更加坑. 可能你测试的数据量还没到
zioc
2017-04-01 10:33:41 +08:00
@8355 几万条吧 满足需要了
JKeita
2017-04-01 10:47:58 +08:00
explain 一下看了下查询,应该是第一条比较快
surfire91
2017-04-01 10:50:26 +08:00
恕我眼拙,这个跟 SELECT * FROM API_LOG LIMIT 0, 10 有啥区别
fxxkgw
2017-04-01 10:55:58 +08:00
没看懂 但是慎用笛卡尔积
raycloud
2017-04-01 10:58:14 +08:00
@surfire91 #8 +1 ,没看懂为什么要写的这么复杂
qfdk
2017-04-01 11:33:11 +08:00
加个 index 有想不到的结果
zander1024
2017-04-01 12:29:37 +08:00
我不懂这个 Join 有卵用?.. 可能是我 mysql 学的假的
AnonymousAccout
2017-04-01 12:33:54 +08:00
好吧 第二个里的子查询那个 select * from 也没用吧...
sujin190
2017-04-01 13:00:34 +08:00
WHERE IN 又子查询在 mysql 上的实现似乎是上一级的查询的每一条数据做一次子查询, mysql 文档上似乎有详细解释,可以去看下,我记得是这么写的,还是用第一种好
luckyduck
2017-04-01 13:03:16 +08:00
楼上看不懂的是因为不了解什么叫覆盖索引。。。
sujin190
2017-04-01 13:11:35 +08:00
danielmiao
2017-04-01 13:17:14 +08:00
不理解这么做的意义。。是吧 mysql 优化器当傻 bi ~~~~了么
surfire91
2017-04-01 13:17:18 +08:00
@luckyduck 覆盖索引跟楼主说的 SQL 有什么关系,可否明示?
zioc
2017-04-01 14:06:09 +08:00
@surfire91
@raycloud
直接 limit 数据量偏移大了会变慢,这个是偏移 ID 主键
@AnonymousAccout 加 SELECT * FROM 是 MySQL 不允许 Limit IN 在子查询里面
realpg
2017-04-01 18:51:37 +08:00
如果不做特殊 CACHE 标记,测试只有第一次有意义……

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/351908

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX