【问题标题】:sorting 1 billion rows by one varchar column in MYSQL quickly在 MYSQL 中按 varchar 列快速排序 10 亿行
【发布时间】:2011-06-08 06:19:18
【问题描述】:

我在 MYSQL 中存储了 10 亿行,我需要通过 varchar 列按字母顺序输出它们,最有效的方法是什么。允许使用其他 linux 实用程序,如 sort awk。

【问题讨论】:

    标签: mysql sorting large-data-volumes


    【解决方案1】:

    MySQL 可以处理十亿行。效率取决于 3 个主要因素:缓冲区、索引和连接。

    一些建议:

    尝试将您正在使用的数据集放入内存中

    在内存中的处理速度要快得多,这样一来你就可以解决一大堆问题。使用多个服务器来托管部分数据集。将您要使用的部分数据存储在临时表等中。

    更喜欢全表扫描而不是索引访问

    对于大型数据集,全表扫描通常比范围扫描和其他类型的索引查找更快。即使您查看 1% 或行或更少的全表扫描也可能会更快。

    避免连接到大表

    使用嵌套循环连接大型数据集非常昂贵。尽量避免它。连接到较小的表是可以的,但您可能希望在连接之前将它们预加载到内存中,这样就不需要随机 IO 来填充缓存。

    请注意 MySQL 的限制,这要求您在处理大型数据集时要格外小心。在 MySQL 中,查询作为单线程运行(MySQL Cluster 除外),并且 MySQL 会一一发出 IO 请求以执行查询,这意味着如果您关心单个查询执行时间,那么许多硬盘和大量 CPU 将无济于事.

    有时最好手动将查询拆分为多个,并行运行并聚合结果集。

    您没有提供有关您的设置或数据集的太多信息,但这应该为您提供一些注意事项的线索。在我看来,让(经过适当调整的)数据库为您排序会比以编程方式进行排序要快,除非您的帖子中没有提到非常具体的需求。

    【讨论】:

      【解决方案2】:

      您是否尝试过索引列并将它们转储出去?我会先尝试一下,看看性能是否不足,然后再进行异国情调。

      【讨论】:

      • 如果这还不够快,我会尝试某种全文索引(如 lucene)来进行排序,然后获取所需的信息
      【解决方案3】:

      这取决于您如何定义高效。 CPU/内存/IO/时间/编码努力。在这种情况下什么是重要的?

      "select * from big_table order by the_varchar_column" 这可能是对开发人员资源的最有效利用。添加索引可能会使它运行得更快。

      【讨论】:

        猜你喜欢
        • 2017-12-23
        • 2021-07-14
        • 2015-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-09
        • 1970-01-01
        • 2020-12-13
        相关资源
        最近更新 更多