首页 > 解决方案 > MySQL 性能:按连接表的内容排序

问题描述

在基于较大表的动态子集对查询进行排序时,有没有办法提高性能?

作为参考,我有两个表:

一个常见的查询可能是这样的:

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),这将有助于提高按名称排序时的性能。

这里有比非规范化更好的选择吗?缓存很困难,因为每个报告可以按十几个不同的字段进行排序,结果需要分页,并且用户可以将各种类型的过滤器/搜索应用于结果。

标签: mysqlperformancejoinindexingdenormalization

解决方案


inventory_items needs INDEX(vendor_id)

推荐阅读