elasticsearch,Mysql,Database,Apache Spark,Hadoop,elasticsearch" /> elasticsearch,Mysql,Database,Apache Spark,Hadoop,elasticsearch" />

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

Mysql 按任何列/属性对大型数据集进行排序,mysql,database,apache-spark,hadoop,elasticsearch,Mysql,Database,Apache Spark,Hadoop,elasticsearch,我有一个MySQL数据库,在一些表中分布着大约2000万个条目(并且还在增长)。我的系统有一个功能,这些信息显示在页面中。因此,到目前为止还不错,我只需要使用SQL进行一些连接,并根据页面大小限制结果集 问题是,现在我需要实现排序功能,这样用户就可以按任何列对数据进行排序。在所有列中添加索引似乎不是一个好的选择,如果不添加索引,则会导致整个表扫描。更糟糕的是:SQL的ORDER BY在按联接列排序时可能会更慢 所以我开始考虑另一种可能性,比如将MySQL与Hadoop或Spark集成,但我没有这

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

问题是,现在我需要实现排序功能,这样用户就可以按任何列对数据进行排序。在所有列中添加索引似乎不是一个好的选择,如果不添加索引,则会导致整个表扫描。更糟糕的是:SQL的ORDER BY在按联接列排序时可能会更慢

所以我开始考虑另一种可能性,比如将MySQL与Hadoop或Spark集成,但我没有这方面的经验

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


谢谢。

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

使用分区的一个关键好处是分区修剪。这意味着,当您在where子句中使用某些列时,查询计划器知道它需要查找哪些分区,哪些分区与该查询无关。只搜索相关分区会使查询速度更快。您可以在日期列或自动递增整数(串行)之类的对象上对表进行范围分区

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

下面是关于分区表的一个很好的通用资源:


在这个StackExchange问题上选择的答案是关于向已经存在的表添加分区:

限制
而不使用
按顺序
几乎没有意义。如果不提供
ORDER BY
子句,引擎可以按任意顺序返回行,这使得分页非常不稳定。但是,为什么要在页面中显示2000万行呢?也许您应该首先使用一些过滤条件来限制结果集。我不认为任何用户会阅读第150000页。谢谢您的评论@TheImpler。我尽量使问题尽可能简单。在实践中,我确实使用单栏过滤和排序。所以我不检索2000万行。问题是,通过这种修改,过滤器可以获取任何内容,并且可以按任何列进行排序。即使对于mysql,20m也是微不足道的。若你们有数千个用户,那个么性能可能会有问题,但你们几乎并没有提出其他问题。是的,但分区通常适用于单列排序。如果OP有多个排序(似乎是这样),那么分区对其他排序没有帮助。这意味着多个列可用于确定范围分区或列表分区的键。OP可以为分区使用多列键,然后分区修剪可以用于包含这些列中任何一列的where子句或sort。范围和列表分区现在也允许基于非整数列进行分区。还是会有一些差距的,是的。如果没有主要的模式规范化,这可能是最好的解决方案。列分区文档:是的,但正如您所说,这仍然适用于单个键(即使它由多个列组成)。但是,OP需要多个独立的标准+感谢你们的努力,因为它可能对一个订购标准很有用,也许是最重要的一个。谢谢大家@投标人是正确的,我需要多个/不同的标准。所以我不确定MySQL分区是否是正确的答案。