【发布时间】:2011-06-08 06:19:18
【问题描述】:
我在 MYSQL 中存储了 10 亿行,我需要通过 varchar 列按字母顺序输出它们,最有效的方法是什么。允许使用其他 linux 实用程序,如 sort awk。
【问题讨论】:
标签: mysql sorting large-data-volumes
我在 MYSQL 中存储了 10 亿行,我需要通过 varchar 列按字母顺序输出它们,最有效的方法是什么。允许使用其他 linux 实用程序,如 sort awk。
【问题讨论】:
标签: mysql sorting large-data-volumes
MySQL 可以处理十亿行。效率取决于 3 个主要因素:缓冲区、索引和连接。
一些建议:
尝试将您正在使用的数据集放入内存中
在内存中的处理速度要快得多,这样一来你就可以解决一大堆问题。使用多个服务器来托管部分数据集。将您要使用的部分数据存储在临时表等中。
更喜欢全表扫描而不是索引访问
对于大型数据集,全表扫描通常比范围扫描和其他类型的索引查找更快。即使您查看 1% 或行或更少的全表扫描也可能会更快。
避免连接到大表
使用嵌套循环连接大型数据集非常昂贵。尽量避免它。连接到较小的表是可以的,但您可能希望在连接之前将它们预加载到内存中,这样就不需要随机 IO 来填充缓存。
请注意 MySQL 的限制,这要求您在处理大型数据集时要格外小心。在 MySQL 中,查询作为单线程运行(MySQL Cluster 除外),并且 MySQL 会一一发出 IO 请求以执行查询,这意味着如果您关心单个查询执行时间,那么许多硬盘和大量 CPU 将无济于事.
有时最好手动将查询拆分为多个,并行运行并聚合结果集。
您没有提供有关您的设置或数据集的太多信息,但这应该为您提供一些注意事项的线索。在我看来,让(经过适当调整的)数据库为您排序会比以编程方式进行排序要快,除非您的帖子中没有提到非常具体的需求。
【讨论】:
您是否尝试过索引列并将它们转储出去?我会先尝试一下,看看性能是否不足,然后再进行异国情调。
【讨论】:
这取决于您如何定义高效。 CPU/内存/IO/时间/编码努力。在这种情况下什么是重要的?
"select * from big_table order by the_varchar_column" 这可能是对开发人员资源的最有效利用。添加索引可能会使它运行得更快。
【讨论】: