mysql - MySQL 性能:按连接表的内容排序
问题描述
在基于较大表的动态子集对查询进行排序时,有没有办法提高性能?
作为参考,我有两个表:
- products - 包含有关产品的详细信息,包括名称、价格等。
- inventory_items - 包含来自多个供应商的各种产品的当前库存水平。
一个常见的查询可能是这样的:
select (columns)
from inventory_items ii
left join products p on ii.product_id = p.id
where ii.vendor_id = 123
order by p.name
limit 100
因此,我们从inventory_items 中查看的可能有50k 行,它们可能链接到products 表中的45k 行。(在我们的例子中,左连接是必要的,因为我们并不总是拥有供应商库存中所有产品的产品数据。)
这相对较慢且难以索引:查询使用 products 表的主键 (id) 进行连接,而且我认为没有有用的索引可以添加到该表中以提高按不同排序时的性能该表中的列(例如产品名称)。一个产品“有很多”库存项目,所以我不能只在 products 表中添加一个 inventory_id 。
我目前正在考虑通过将我需要的列添加到 inventory_items 表中,或者通过为已编译的报告创建一个新表来对表进行非规范化。这样,我可以将索引添加到 inventory_items 表中,例如 (vendor_id, name),这将有助于提高按名称排序时的性能。
这里有比非规范化更好的选择吗?缓存很困难,因为每个报告可以按十几个不同的字段进行排序,结果需要分页,并且用户可以将各种类型的过滤器/搜索应用于结果。
解决方案
inventory_items needs INDEX(vendor_id)
推荐阅读
- python - Django 模型有一个意外的关键参数
- python - 需要在文件夹中获取最近上传的图像名称。我希望在同一个文件夹中重命名并替换它
- javascript - Webpack 相关错误 - 未捕获(承诺中)错误:找不到模块 './theme/textmate'
- python - 在 moive.py python 中设置音频质量(音频大小为 1.50 GB,当我将其转换为视频时,它只有 500 MB)
- python - 序列或迭代器中的 for 循环
- dns - 即使在 Cloudflare 规则中进行了正确的配置设置,也会出现 301 重定向错误
- amazon-web-services - 是否可以将 SNS 消息从全球 AWS 账户发布到中国账户的 SQS 队列
- assembly - MIPS 处理器 - 为什么 sub 导致溢出而 slt 不是?
- c++ - 使用 % 运算符获取余数
- vb.net - 在 Excel 中将工作表添加到工作簿的 VB 代码