假设您有一个大型ish数据库表,您希望允许用户使用API查询它,使用几个不同的筛选器和排序选项,当然还支持分页。
对此类查询进行优化的最佳策略是什么?为每一种可能的选项组合创建一个索引似乎不切实际。
关于我所想到的真实世界的例子,请参阅Shopify中的这个产品搜索请求。大公司如何处理这类查询,有20个不同的过滤器和10个不同的排序选项,在可能有数十万行的表上?
在我们的特殊情况下,我们在AWS中使用MySQL。
谢谢!
发布于 2022-06-05 16:05:18
你不能为每件事进行优化。
实际上,优化的定义是选择一种比其他查询更有优势的查询类型。
如果所有的查询都是“优化”的,那么它们都没有任何特殊的优势。不知怎么的,他们都更快了。
听起来你只是需要一台更快的电脑。
大公司是如何做到这一点的?各种解决办法:
发布于 2022-06-05 16:52:19
你优化它们就像优化其他东西一样。
不要害怕在一个表上有几个索引,只要它们解决了一个问题,它们就可能值得拥有。考虑哪些查询是允许的,哪些过滤器将是常见的,并对查询的大多数选择性负责。如果你有一个客户表,并且你在寻找标题是'Mr‘,而你的姓是’Sayer‘,那么你在这里的主要选择将由姓氏驱动--包括索引中的标题也不会特别有用。如果您知道您的表及其代表的是什么,那么就很容易知道将使用哪些列来驱动您的查询。
请记住,查询也将由您的应用程序确定--您可以轻松地使用它,以便必须对某些列进行筛选。
按用户确定的列排序通常是主键(如果是序列的话),或者是非常明显的日期列。如果索引列(这可能不会降低表的选择性),那么将order列添加到末尾是一种明智的策略
发布于 2022-06-05 17:55:18
让我们讨论一个两步的过程。
由于表上的索引数量有物理和实用的限制,所以仔细选择有限数量的2列索引。以用户通常搜索的内容为基础。例如,房地产通常从卧室的数量和价格开始。
这是第一步,希望它消除了很大一部分行。第二步是让应用程序过滤其他条件,比如是否有2台洗碗机。这些“混合”条件可以抛到JSON字符串中。
如果您的目录同时包含汽车和服装,那么请认真考虑两个不同的表,每个表都有自己精心设计的索引,加上JSON。
如果表中有10亿行,甚至不要考虑必须扫描所有10亿行的情况。没有任何一台服务器足够大,足够快,使之切实可行。
如果你刚刚开始你的设计,那么计划在几个月后重新设计。让第一个设计成为一个“原型”,在那里您了解什么是有效的,什么是不工作的,然后计划重做模式,而不仅仅是调整它。
https://dba.stackexchange.com/questions/312963
复制相似问题