我想在超大型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
第一种方式的问题(即使列被索引)是查询可能在很长一段时间内崩溃,然后你需要重新开始。
我倾向于第二种方式,还有其他更快的方法吗?
答案 0 :(得分:1)
SELECT col_name FROM mytable GROUP BY col_name;
即使它们返回相同的结果集,这两个查询实际上使用不同的执行计划,我注意到GROUP BY
在某些情况下比MySQL中的DISTINCT
稍快一些。
我支持spinning_plate关于索引的评论。如果你已经有一个,那么获得你的结果应该会少得多。你索引的基数是什么?
答案 1 :(得分:0)
我仍然可以在MySQL中工作,它可能比你自己编写或在UNIX命令行上做的更快。像对待DW中的物化视图或聚合表一样对待它 - 一种简单的方法是创建一个批处理脚本,将小范围内的SELECT DISTINCTS转换为仅具有不同值的第二个表(通过MERGE或其他机制)。这是更容易混淆的,但是你会遇到相同的性能问题,只是分散在各个工作中。您将不得不尝试参数(批量大小)。如果你在生产环境中运行它,并且人们希望获得所有不同的值,就好像他们直接查询数据库一样,最好有3个表,原始表,当前批处理的临时表,以及带有最新值和date_modified列的实时表。