繁体   English   中英

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

[英]find distinct values of a varchar column in an super-large MYSQL table

我想在超大 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

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

  1. ...
  2. ...
  3. SELECT col_name FROM mytable GROUP BY col_name;

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM