【发布时间】:2018-10-19 01:05:59
【问题描述】:
在对基于较大表的动态子集的查询进行排序时,有没有办法提高性能?
作为参考,我有两张表:
- 产品 - 包含有关产品的详细信息,包括名称、价格等。
- 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) 这将有助于提高按名称排序时的性能。
这里有比非规范化更好的选择吗?缓存很困难,因为每个报告可以按十几个不同的字段进行排序,结果需要分页,并且用户可以对结果应用各种类型的过滤器/搜索。
【问题讨论】:
-
唯一确定的方法是在创建索引之前和之后从查询中获取自己的解释计划。连接中使用的任何列的索引都会有所帮助,另外还有用于 where 子句中的列的索引。 p.name 上的索引可能会加快排序速度。见stackoverflow.com/questions/6858844/…
标签: mysql performance join indexing denormalization