这两个查询之间的效率或其他差异是什么?

时间:2017-10-09 12:42:36

标签: mysql sql time-complexity big-o

我下载了Yelp数据集并将其放入MySQL中,因为我一直在使用的数据集太小而不必考虑效率。我试图忘记或意识到错误的SQL习惯,这将导致更大的数据集出现问题。

以下是从数据库中提取完全相同信息的两种方法:

USE yelp_db;

SELECT name, hours FROM business
LEFT JOIN hours
ON business.id = hours.business_id;
-- time taken 0,0025sec, 776071 rows returned

SELECT name, hours FROM
(SELECT name, id from business) AS b
LEFT JOIN
(SELECT hours, business_id from hours) AS h
ON b.id = h.business_id;
-- time taken 0,0015sec, 776071 rows returned

以下是输出示例:

John's Chinese BBQ Restaurant   NULL
Primal Brewery  Monday|16:00-22:00
Primal Brewery  Tuesday|16:00-22:00
Primal Brewery  Friday|12:00-23:00

第一种方法需要3行但看起来比第二种方法略慢,后者需要5行。

这些方法中的任何一种在效率或优雅方面都是首选,如果是这样,为什么?

2 个答案:

答案 0 :(得分:2)

第一种方法在性能和优雅方面都是首选 - 您的结果无法承受。

我对时间有点怀疑。我希望超过一毫秒或两秒可以返回接近一百万行。

在任何情况下,大多数MySQL版本(最新版本可能是例外)都会实现子查询。这为查询添加了额外的写入和读取层。它还可以防止使用索引。

至于优雅,不必要的子查询对于优雅"没有任何作用。这可能是一个意见问题,但我猜它是相当广泛的。

答案 1 :(得分:1)

只是为了扩大@GordanLinoff的优秀答案,为什么你会看到这种差异。

如果按照显示的顺序运行它们,可以从第一个数据中简单地缓存数据,这可以解释时间问题。这种缓存可以在很多地方发生,一直到光盘控制器。

测试有用结果的唯一方法是运行多次迭代并在清除所有缓存后平均结果。