【发布时间】:2016-02-02 13:23:15
【问题描述】:
首先,我们的环境是 PHP + MYSQL。 我们有一个表格 Articles,它是一个用来保存文本文章的表格。大约有15000条记录。 我们的查询存在性能问题:
SELECT article_id, article_title, article_status,
article_date_time, article_publish_date
FROM articles
WHERE article_status IN ('approved')
AND (article_publish_date <= now())
AND ((article_expiry_date = '0000-00-00') OR
(article_expiry_date <> '0000-00-00'
AND article_expiry_date >= now()))
AND articles_id IN (1, 2, 3... a list of about 9,000 possible ID's)
GROUP BY article_id
ORDER BY article_date_time DESC LIMIT 0,5;
在我们的测试站点(db server 和 web server 在同一台机器上),如果我第一次运行查询,查询的执行时间大约是 30 秒。 还是在测试站点,如果我只是刷新页面第二次运行查询,查询的执行时间大约是0.2秒。
如果一直刷新,执行时间还是0.2秒左右。但是如果我停止大约 15 分钟,执行时间又会是 30 秒,然后是 0.2 秒...
问题 1 来了:第一次执行和第二次执行之间的巨大差异是什么?缓存?如果是这样,那么它是如何产生影响的呢?
仍然是同一个查询,在我们的实时站点中(仍然,db server 和 web server 在同一台机器上),查询的执行时间约为 3 秒。但是无论您运行多少次查询,时间都在 3 秒左右。
test db 是 live db 的备份,所以 db 的差异不应该造成如此不同的结果。
那么问题2来了:为什么live site的执行时间不是30秒也不是0.2秒?为什么在第二次执行时它不会改变?
有人可以帮忙吗?
【问题讨论】:
-
mysql OR sql-server?它们不一样
-
是mysql服务器吗?使用什么数据库类型?创新数据库?对于缓存问题, - 检查缓存参数,有可能在生产环境中您必须减小查询缓存大小。另外,也许您在生产中的数据库中有一些锁定?
-
您必须在每个服务器中进行不同的配置。无论如何,您的 WHERE 子句似乎在浪费时间进行一些比较(?)可能的 id 来自哪里?
-
如果您主要关心的是性能,我会先看看 SQL 本身。 9000个id的列表?您应该使用这些 id、主键、索引创建一个表,并且会提高速度。还有为什么你有
article_expiry_date <> '0000-00-00' AND?你可以忽略它,这是暗示的。 -
如果 id 碰巧是连续的
WHERE id BETWEEN x and y,您可以进行范围搜索