针对Distinct计数的Mysql查询优化

时间:2012-10-19 08:57:33

标签: mysql datatable query-optimization

我有这样的查询

select count(distinct sessionKey) as tot from visits

但执行48512 ms需要花费太多时间 在几个月内,表格中的数据将成为当前数据量的两倍。我如何优化此查询

这是我的表结构

enter image description here

2 个答案:

答案 0 :(得分:4)

在您的专栏INDEX中添加SessionKey,这样可以提高其效果。

ALTER TABLE visits ADD INDEX (SessionKey)

答案 1 :(得分:1)

与其他建议一样,添加索引将是第一个也是最容易做的事情。 如果你有大量的线路,那么通过所有这些线路可能需要一些时间。

我曾经遇到类似这样的问题,有人编写了一个系统,用户可以对新闻条目进行投票。每个投票都作为单行保存在数据库中。在每个网页上都有一个“最高投票”的新闻列表。这基本上意味着有一个查询来选择完整的投票表,总结它们,并在该总和之后进行排序。条目数在100k以上,这需要一些时间。我之前有人通过试图“缓存”结果来“解决”它。这大部分时间都很好用,但是如果你已经清理了所有缓存,那么整个页面都会混乱几个小时,直到缓存再次构建。然后,我通过不保存每行投票来修复它,但只是对每个条目进行求和。

我想告诉你的是:您可以尝试缓存(但结果当然不是“实时”),或者更改数据库中的某些内容,例如添加字段或表格来存储您想要的计数读取每次插入访问表时更新的内容。这会对插入产生更多的负担,但是获得这个数字会非常便宜。