在超大型MYSQL表中查找varchar列的不同值

时间:2011-06-10 23:50:38

标签: mysql sorting unique distinct

我想在超大型MYSQL表(10亿行)中找到varchar列的不同值。
我有以下解决方案:

1. select distinct(col_name) from mytable; 
2. export this column to a text file incrementally(select col_name from mytable where myid>x and myid<x+n), then use linux sort 
sort myfile.txt | uniq -u

第一种方式的问题(即使列被索引)是查询可能在很长一段时间内崩溃,然后你需要重新开始。
我倾向于第二种方式,还有其他更快的方法吗?

2 个答案:

答案 0 :(得分:1)

  1. ...
  2. ...
  3. SELECT col_name FROM mytable GROUP BY col_name;
  4. 即使它们返回相同的结果集,这两个查询实际上使用不同的执行计划,我注意到GROUP BY在某些情况下比MySQL中的DISTINCT稍快一些。

    我支持spinning_plate关于索引的评论。如果你已经有一个,那么获得你的结果应该会少得多。你索引的基数是什么?

答案 1 :(得分:0)

可悲的是,我不得不在使用MySQL之前采用这种废话。如果你不能只提取索引,并且GROUP BY不能更快地工作(不知道为什么会这样,那么@Ben ..的帖子),你可以尝试将问题分段以批处理。

我仍然可以在MySQL中工作,它可能比你自己编写或在UNIX命令行上做的更快。像对待DW中的物化视图或聚合表一样对待它 - 一种简单的方法是创建一个批处理脚本,将小范围内的SELECT DISTINCTS转换为仅具有不同值的第二个表(通过MERGE或其他机制)。这是更容易混淆的,但是你会遇到相同的性能问题,只是分散在各个工作中。您将不得不尝试参数(批量大小)。如果你在生产环境中运行它,并且人们希望获得所有不同的值,就好像他们直接查询数据库一样,最好有3个表,原始表,当前批处理的临时表,以及带有最新值和date_modified列的实时表。