Mysql 从索引列上的表中选择DISTINC(列)的计算复杂性
问题 我不是计算机科学专业的学生,所以请原谅我混淆了术语。调用的计算复杂度是多少Mysql 从索引列上的表中选择DISTINC(列)的计算复杂性,mysql,sql,group-by,distinct,time-complexity,Mysql,Sql,Group By,Distinct,Time Complexity,问题 我不是计算机科学专业的学生,所以请原谅我混淆了术语。调用的计算复杂度是多少 SELECT DISTINCT(column) FROM table 或 在索引的列上?它与行数或列中不同值的数量成比例。我相信这将是O(1)*NUM\u disict\u COLSvsO(NUM\u OF\u ROWS) 背景 例如,如果我有1000万行,但该列中只有10个不同的值/组,那么可以直观地计算每个组中的最后一项,这样时间复杂度将与不同组的数量而不是行的数量挂钩。因此,100万行的计算时间与100万
SELECT DISTINCT(column) FROM table
或
在索引的列上?它与行数或列中不同值的数量成比例。我相信这将是O(1)*NUM\u disict\u COLS
vsO(NUM\u OF\u ROWS)
背景
例如,如果我有1000万行,但该列中只有10个不同的值/组,那么可以直观地计算每个组中的最后一项,这样时间复杂度将与不同组的数量而不是行的数量挂钩。因此,100万行的计算时间与100万行的计算时间相同。我相信复杂程度会更高
O(1)*Number_Of_DISTINCT_ELEMENTS
但是在MySQL的情况下,如果我有10个不同的组,MySQL还会搜索每一行,基本上计算每个组中的一部分,还是设置为可以在O(1)时间内为每个不同的列值计算相同值的一组行?如果不是的话,我相信这意味着复杂性
O(NUM_ROWS)
我为什么在乎?
我在我的网站上有一个页面,列出了各类邮件的统计信息,如未读邮件总数、邮件总数等。我可以使用groupby
和SUM()
计算这些信息,但我觉得随着邮件数量的增长,这将花费更长的时间,因此我为每个类别都提供了一个统计表。发送或创建新消息时,我会增加total_messages(消息总数)字段。当我想查看状态页面时,我只需选择一行
SELECT total_unread_messages FROM stats WHERE category_id = x
而不是使用groupby
和/或disect
在所有消息中计算这些统计数据
在我的情况下,无论哪种方式对性能的影响都不大,因此这可能看起来像是“过早优化”,但如果我正在做的事情与其他不需要花费太多时间构建的选项相比是可伸缩的还是不可伸缩的,那就很好了。如果您正在做:
select distinct column
from table
在列
上有一个索引,然后MySQL可以使用“松散索引扫描”(已描述)处理该查询
这应该允许引擎从索引中读取一个键,然后“跳转”到下一个键,而无需读取中间键(它们都是相同的)。这表明该操作不需要读取整个索引,因此通常小于O(n)
(其中n
=表中的行数)
我怀疑找到下一个值只需要一次操作。如果总体复杂性类似于O(m*log(n))
,其中m
=不同值的数量,我不会感到惊讶
select distinct column
from table