首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为任意用户生成的查询优化表?

如何为任意用户生成的查询优化表?
EN

Database Administration用户
提问于 2022-06-05 14:09:43
回答 3查看 108关注 0票数 0

假设您有一个大型ish数据库表,您希望允许用户使用API查询它,使用几个不同的筛选器和排序选项,当然还支持分页。

对此类查询进行优化的最佳策略是什么?为每一种可能的选项组合创建一个索引似乎不切实际。

关于我所想到的真实世界的例子,请参阅Shopify中的这个产品搜索请求。大公司如何处理这类查询,有20个不同的过滤器和10个不同的排序选项,在可能有数十万行的表上?

在我们的特殊情况下,我们在AWS中使用MySQL。

谢谢!

EN

回答 3

Database Administration用户

发布于 2022-06-05 16:05:18

你不能为每件事进行优化。

实际上,优化的定义是选择一种比其他查询更有优势的查询类型。

如果所有的查询都是“优化”的,那么它们都没有任何特殊的优势。不知怎么的,他们都更快了。

听起来你只是需要一台更快的电脑。

大公司是如何做到这一点的?各种解决办法:

  • 大电脑的喇叭声。
  • 以不同的方式缓存数据,所以在大多数情况下根本不需要运行查询。
  • 多个数据副本,以不同的方式编制索引,或以不同的方式取消规范化。因此,应用程序代码需要知道如何将某些查询与正确的数据副本相匹配。否则,启动对所有副本的查询,返回最快的就是响应。
票数 2
EN

Database Administration用户

发布于 2022-06-05 16:52:19

你优化它们就像优化其他东西一样。

不要害怕在一个表上有几个索引,只要它们解决了一个问题,它们就可能值得拥有。考虑哪些查询是允许的,哪些过滤器将是常见的,并对查询的大多数选择性负责。如果你有一个客户表,并且你在寻找标题是'Mr‘,而你的姓是’Sayer‘,那么你在这里的主要选择将由姓氏驱动--包括索引中的标题也不会特别有用。如果您知道您的表及其代表的是什么,那么就很容易知道将使用哪些列来驱动您的查询。

请记住,查询也将由您的应用程序确定--您可以轻松地使用它,以便必须对某些列进行筛选。

按用户确定的列排序通常是主键(如果是序列的话),或者是非常明显的日期列。如果索引列(这可能不会降低表的选择性),那么将order列添加到末尾是一种明智的策略

票数 1
EN

Database Administration用户

发布于 2022-06-05 17:55:18

让我们讨论一个两步的过程。

由于表上的索引数量有物理和实用的限制,所以仔细选择有限数量的2列索引。以用户通常搜索的内容为基础。例如,房地产通常从卧室的数量和价格开始。

这是第一步,希望它消除了很大一部分行。第二步是让应用程序过滤其他条件,比如是否有2台洗碗机。这些“混合”条件可以抛到JSON字符串中。

如果您的目录同时包含汽车和服装,那么请认真考虑两个不同的表,每个表都有自己精心设计的索引,加上JSON。

如果表中有10亿行,甚至不要考虑必须扫描所有10亿行的情况。没有任何一台服务器足够大,足够快,使之切实可行。

如果你刚刚开始你的设计,那么计划在几个月后重新设计。让第一个设计成为一个“原型”,在那里您了解什么是有效的,什么是不工作的,然后计划重做模式,而不仅仅是调整它。

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/312963

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档