按任何列/属性对大型数据集进行排序

时间:2019-05-08 16:41:28

标签: mysql database apache-spark hadoop elasticsearch

我有一个MySQL数据库,在某些表中分布着约2000万个条目(并且正在增长)。我的系统具有在页面中显示此信息的功能。因此,到目前为止,到目前为止,我只需要使用SQL进行一些JOIN查询并限制结果集的页面大小即可。

问题在于,现在我需要实现排序功能,以便用户可以按任意列对数据进行排序。在所有列中添加索引似乎不是一个很好的选择,并且不使用索引将导致全表扫描。甚至更糟糕的是:按联接列排序时,SQL的ORDER BY可能会更慢。

所以我开始考虑其他可能性,例如将MySQL与Hadoop或Spark集成在一起,但是我对此没有经验。

正确的道路是什么? Haddop,Spark,ElasticSearch,或在MySQL中使用其他策略,或其他?

谢谢。

1 个答案:

答案 0 :(得分:1)

您最好的选择可能是结合使用索引和远程分区。分区将有效地创建许多较小的表,这些表可以作为一个表一起工作,并且可以作为一个表进行查询。

使用分区的一个主要好处是分区修剪。这意味着,当您在where子句中使用某些列时,查询计划者会知道它需要查找哪些分区,哪些与该查询无关。仅搜索相关分区会使查询更快。您可以对表进行范围分区,例如日期列或自动增量int(序列)。

其他类型的分区包括哈希和列表。如果要基于特定值进行查询,则哈希和列表通常更有用。这就是为什么我建议远程分区。

这是一个很好的常规资源分配分区表:Everything You Need to Know About MySQL Partitions

此StackExchange问​​题的选择答案是将分区添加到已存在的表中:How do I add a partition to an existing table in mariadb / mysql?