针对不同计数的Mysql查询优化
我有一个这样的疑问针对不同计数的Mysql查询优化,mysql,datatable,query-optimization,Mysql,Datatable,Query Optimization,我有一个这样的疑问 选择count(distinct sessionKey)作为访问总数 但现在执行48512毫秒需要太多时间。 在几个月内,表中的数据将成为当前数据量的两倍。如何优化此查询 这是我的桌子结构 在您的列SessionKey中添加一个索引,它将提高其性能 ALTER TABLE visits ADD INDEX (SessionKey) 在列SessionKey中添加一个索引,它将提高其性能 ALTER TABLE visits ADD INDEX (SessionKey) 正
选择count(distinct sessionKey)作为访问总数
但现在执行48512毫秒需要太多时间。在几个月内,表中的数据将成为当前数据量的两倍。如何优化此查询
这是我的桌子结构
在您的列
SessionKey
中添加一个索引
,它将提高其性能
ALTER TABLE visits ADD INDEX (SessionKey)
在列
SessionKey
中添加一个索引
,它将提高其性能
ALTER TABLE visits ADD INDEX (SessionKey)
正如其他人建议的那样,添加索引将是第一件也是最容易的事情。 如果你有一大堆的线在那里,不管怎样,通过所有的线可能需要一些时间 我曾经遇到过这样的问题,有人编写了一个系统,用户可以对新闻条目进行投票。每一张选票都保存为数据库中的一行。在每一个网页上都有一个“得票最多”的新闻列表。这基本上意味着有一个查询来选择完整的投票表,对它们进行汇总,然后在汇总后进行排序。对于多个100k范围的条目,这需要花费一些时间。在我之前的某个人通过尝试“缓存”结果来“解决”它。这在大多数情况下都很有效,但是如果你已经清理了所有的缓存,那么整个页面就会混乱几个小时,直到缓存再次建立。然后,我修正了这个问题,不再保存自己行中的每一张选票,而是只保存每个条目的总和
我想告诉您的是:您可以尝试缓存(但结果当然不会是“实时的”),也可以在数据库中更改某些内容,例如添加一个字段或表,在其中存储要读取的计数,每次插入时都会将其更新到visits表中。这将在insert上增加一点负载,但获得该数字将非常便宜。像其他人建议的那样,添加索引将是第一件也是最简单的事情。 如果你有一大堆的线在那里,不管怎样,通过所有的线可能需要一些时间 我曾经遇到过这样的问题,有人编写了一个系统,用户可以对新闻条目进行投票。每一张选票都保存为数据库中的一行。在每一个网页上都有一个“得票最多”的新闻列表。这基本上意味着有一个查询来选择完整的投票表,对它们进行汇总,然后在汇总后进行排序。对于多个100k范围的条目,这需要花费一些时间。在我之前的某个人通过尝试“缓存”结果来“解决”它。这在大多数情况下都很有效,但是如果你已经清理了所有的缓存,那么整个页面就会混乱几个小时,直到缓存再次建立。然后,我修正了这个问题,不再保存自己行中的每一张选票,而是只保存每个条目的总和
我想告诉您的是:您可以尝试缓存(但结果当然不会是“实时的”),也可以在数据库中更改某些内容,例如添加一个字段或表,在其中存储要读取的计数,每次插入时都会将其更新到visits表中。这将在insert上增加一点负载,但获得该数字将非常便宜。index()将影响insert性能,如果将索引正确设置为字段,则会减慢insert操作?index()是否会影响插入性能它对字段的正确设置索引是否会降低插入操作的速度?我指的是列
SessionKey
。它对字段的正确设置索引是否会降低插入操作的速度?是的,当然会,除此之外,它还会占用更多的磁盘空间。(但肯定不会有那么多,而且肯定是值得的)。根据条目数量的不同,您可能会等到晚上或其他时间来尝试,因为创建索引可能需要一些时间(对于一个条目来说并不多,但对于所有已经存在的条目来说..谁知道呢)我指的是列SessionKey
。将索引设置为字段是否正确会减慢插入操作?是的,当然会,除此之外,它还需要更多的磁盘空间。(但肯定不会有那么多,而且肯定是值得的)。根据条目的数量,您可能会等到晚上或其他时间来尝试,因为创建索引可能需要一些时间(对于一个条目来说并不多,但是对于所有已经存在的条目来说..谁知道呢)