【发布时间】:2017-09-08 12:53:04
【问题描述】:
我有一个名为“DataVisitorActivity”的小表格,其中包含这些字段
id int auto_increment primary key,
vID int null,
category varchar(128) null,
timestamp timestamp default CURRENT_TIMESTAMP not null,
value text null,
handle text null
它有 2 个索引字段
handle_index(handle)
DataVisitorActivity_vID_index(vID)
到目前为止,我没有出现任何性能问题,所有工作都在大约 0.01 秒内完成。 目前该表有大约 200 万个条目,并且每天都会变大(我们将用户访问的每个网站都保存在此列表中) 上次编辑表格时我唯一需要更改的是将“句柄”设置为“文本”,因为我们在该字段中保存了非常长的字符串。 改变我使用的查询
SELECT COUNT(*) AS `blog_count`, handle FROM DataVisitorActivity WHERE value = "blog" GROUP BY handle ORDER BY blog_count DESC Limit 5
这一次它需要 0.1 - 0.3 秒,对我来说还是可以的。
我现在看到查询有时(看起来很随机)需要大约 5-15 秒才能执行。 我刚刚写了一个 while 循环,让它运行 10x10 次,总共 100 次。 大约 60 小于 1 秒 20 小于 5 秒,其他所有大于 5 秒。
所以我的问题是:这个查询需要这么长时间是因为表越来越大吗?为什么执行时间变化如此之大?
编辑:在 phpmayadmin 中,此查询每次在 0.001 秒内执行
【问题讨论】:
-
如果您多次快速运行查询,服务器只会缓存一点结果,但有时表会发生变化,它必须为您重新计算所有内容。另外如何使用 COUNT(id) 而不是不确定使用 * 是否是神话般的性能打击。
-
嘿@Recct 我现在用 COUNT(id) 尝试了相同的结果,坦克供您快速推荐
-
您的数据库的碎片整理程度如何?您多久重建一次索引?您应该每周尝试将碎片保持在 10% 以下,并每周重建以获得最佳性能。下面的答案也是很好的建议。您应该索引较小的数据类型
标签: php mysql sql phpmyadmin