Php Sql索引性能?

Php Sql索引性能?,php,mysql,sql,phpmyadmin,Php,Mysql,Sql,Phpmyadmin,我有一个名为“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 nul

我有一个名为“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
它有两个索引字段

handle_index(handle)
DataVisitorActivity_vID_index(vID)
到目前为止,我没有任何性能问题,所有这些问题都是在0.01秒左右完成的。 目前,该表有大约200万个入口,并且每天都会越来越大(我们将用户访问的每个网站都保存在该列表中) 上次编辑表格时,我唯一需要更改的是将“handle”设置为“text”,因为我们在该字段中保存了很长的字符串。 有了这个更改,我使用的查询

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秒内执行此查询

我认为您的
按句柄分组
就是问题所在。这个字段能有多大?你有索引吗?在此处检查文本列上的索引:


一个可能的解决方案是添加一个列,在其中存储
handle
列的sha1哈希。这将有一个固定的宽度,因此您可以轻松地在其上添加索引和分组依据。然后使用
EXPLAIN
查看可以改进的地方。

如果快速多次运行查询,服务器只会缓存一点结果,但有时表会更改,它必须为您重新计算所有内容。另外,使用COUNT(id)如何?我不确定使用*是否达到了神话般的性能要求。嘿@rect我尝试使用COUNT(id)获得相同的结果,请快速推荐。您的数据库碎片整理情况如何?您多长时间重建一次索引?您应该尝试每周将碎片保持在10%以下,并每周重建以获得最佳性能。下面的答案也是很好的建议。您应该在较小的数据类型上建立索引我在“handle”字段上使用了全文索引。就像你例子中的李斯特。GoogleRefferer存储在“句柄”字段中,以使它们变得真实long@BurakTopal我不认为全文索引对分组有用,但您必须尝试使用带前缀的索引来查看差异。即使我不分组,我也有超过1秒的执行时间:(我需要一些绑定到句柄字段的搜索字段的全文索引。我只能使用长度为150-300的“前缀索引”,我认为搜索不会比搜索更干净,但我将尝试使用前缀索引(150)进行测试)这一次甚至比全文索引要花更长的时间。还有其他解决方案我不能在sha1中搜索字符串吗hash@BurakTopal哈希不用于全文搜索,您仍然可以使用另一列进行搜索。哈希仅用于索引和分组。