在基于较大表的动态子集对查询进行排序时,有没有提高性能的方法?
作为参考,我有两张表:
产品-包含有关产品的详细信息,包括名称、价格等。
库存项目-包含来自多个供应商的各种产品的当前库存水平。
常见的查询可能类似于:
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\u items中查看5万行,这可能会链接到products表中的4.5万行(在我们的例子中,左连接是必要的,因为我们并不总是拥有供应商库存中所有产品的数据。)
这是相对缓慢和难以索引的:查询使用products表的主键(id)进行连接,并且我不认为有一个有用的索引可以添加到该表中,以提高按该表中的不同列(例如product name)排序时的性能。一个产品“有许多”库存项目,所以我不能只在products表中添加一个inventory\u id。
我目前正在考虑对该表进行非规范化,或者将所需的列添加到inventory\u items表中,或者为已编译的报表创建一个新表。这样我就可以向inventory\u items表添加索引,例如(vendor\u id,name),这将有助于提高按名称排序时的性能。
这里有比反规范化更好的选择吗?缓存很困难,因为每个报表都有十几个不同的字段可以排序,结果需要分页,并且用户可以对结果应用各种类型的过滤器/搜索。
2条答案
按热度按时间raogr8fs1#
请参阅产品文档(例如)https://dev.mysql.com/doc/refman/5.7/en/order-by-optimization.html#order-按索引使用
在某些情况下,mysql可以使用索引来满足order by子句,并避免执行filesort操作时所涉及的额外排序。
即使orderby与索引不完全匹配,也可以使用索引,只要索引的所有未使用部分和所有额外orderby列都是where子句中的常量。
索引可以用于排序,如果这是真的,那么排序性能将得到提高。
所以,在你的例子中
p.name
但是,要知道使用了哪些索引以及何时使用这些索引,唯一的方法就是获得一个解释计划。b5lpy0ml2#