我正试图从600万行表中获取不同的id。查询非常简单,解释似乎没问题。 distict行被索引为uid-date-time的分组索引的一部分。
查询
SELECT DISTINCT uid FROM events;
并在17分15.54秒内返回334117行。
解释是
+----+-------------+-------------+-------+---------------+----------------+---- ----+------+------+--------------------------+ | id | select_type | table | type | possible_keys | key | keylen | ref | rows | Extra | +----+-------------+-------------+-------+---------------+----------------+--------+------+------+--------------------------+ | 1 | SIMPLE | events | range | NULL | dateuid_idx | 4 | NULL | 10 | Using index for group-by | +----+-------------+-------------+-------+---------------+----------------+---- ----+------+------+--------------------------+如果uid以单独的索引保存,那么这会更快吗? 还是有另一种方法可以加快速度吗?
答案 0 :(得分:2)
它看起来像你的索引按日期,然后UID没有帮助。首先通过UID索引或为UID建立单独的索引将大大提高性能。
此外,您可以考虑using GROUP BY instead of DISTINCT。
答案 1 :(得分:2)
是的,将uid作为单独的索引可以更快。如果没有索引,则需要进行全表扫描;也就是说,它实际上遍历每一行并检查是否已经选择了特定的uid。
然而,如果uid是一个索引,它只需要遍历索引树,如果有很多重复的uid,这可以快得多。
答案 2 :(得分:1)
在uid上创建索引
答案 3 :(得分:0)
单独的uid索引可以加快速度。 然而,创建索引可能需要17分钟(因为必须完成大约相同数量的“读取”才能创建索引。
因此,创建这样的索引都取决于预期的用法。如果相关查询运行几次(如果仅在当前重复记录搜索的“活动”期间),则可能是一个很好的“投资”。