【问题标题】:Sql Index Performance?Sql 索引性能?
【发布时间】: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


【解决方案1】:

我认为您的GROUP BY handle 是问题所在。该字段可以有多大,您是否有索引?在此处查看文本列的索引:https://dev.mysql.com/doc/refman/5.5/en/column-indexes.html

一个可能的解决方案是添加一个列,例如 handle 列的 sha1 哈希。这将具有固定的宽度,因此您可以轻松地在其上添加索引 - 和 GROUP BY。然后使用EXPLAIN 看看你可以改进的地方。

【讨论】:

  • 我在“句柄”字段上使用了全文索引。就像您的示例中的 listet 一样。谷歌推荐人被存储在“句柄”字段中,因此它们变得非常长
  • @BurakTopal 我不认为全文索引对分组有用,但您必须尝试使用​​前缀索引才能看到差异。
  • 即使我没有分组,我的执行时间也超过 1 秒 :( 我需要一些绑定到句柄字段的搜索字段的全文索引。我只能使用“前缀索引”长度为 150-300,我认为搜索不会比搜索干净,但我会尝试
  • 使用前缀索引 (150) 进行测试,这一次甚至比使用全文索引花费的时间更长。有没有其他解决方案我无法在 sha1 哈希中搜索字符串
  • @BurakTopal 哈希不用于全文搜索,您仍然可以使用其他列。哈希仅用于索引和分组。
猜你喜欢
  • 2010-10-29
  • 2013-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-08
  • 2010-12-04
  • 2012-04-25
相关资源
最近更新 更多