gpt4 book ai didi

mysql - 对按标签过滤的项目进行排序

转载 作者:行者123 更新时间:2023-11-29 14:57:11 25 4
gpt4 key购买 nike

我想实现一个非常常见的功能 - 按标签过滤一些项目。互联网上有很多教程,其中包含如何操作的示例。查询非常简单且快速(假设存在适当的索引)。
但通常情况下,过滤后的项目需要按某个字段进行排序。例如,当您按 SO 标签过滤问题时,您会对结果进行排序。

为了完成这项任务(假设我们需要按评级排序),可以这样写:

SELECT item.id FROM item
INNER JOIN taggeditem ON taggeditem.item_id = item.id
WHERE
taggeditem.tag_id = 1234
ORDER BY item.rating DESC

我们有索引(taggeditem.tag_id)(item.id)(item. rating)此查询的问题是 mysql 无法在 item. rating 上使用索引,因为用于获取行的键与 ORDER BY ( MySQL: ORDER BY Optimization ) 中使用的键不同。这导致使用临时表和文件排序,进而导致执行时间变慢。

我想出的解决方案是将排序字段非规范化到 taggeditem 表,以便我可以在 taggeditem< 上创建索引 (tag_id, item_ rating)/.

我在SO搜索了类似的问题,只找到了这个:Mysql slow query: INNER JOIN + ORDER BY causes filesort 。解决方案是一样的。

所以我想问一下,这是解决这个问题的通用方法吗?将一堆排序字段非规范化为 taggeditem(例如创建的、评级的)是一个好习惯吗?在 SO 中,您可以使用 4 个不同的参数(最新、热门、投票、事件)进行排序 - 这是否意味着它们对用于对结果进行排序的字段进行了非规范化?此解决方案还有其他选择吗?

最佳答案

有一个标准的替代方案 - 更改服务器系统变量。例如,您可以尝试使用 sort_buffer_size 值(默认 2MB)。 More关于它。

关于mysql - 对按标签过滤的项目进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4296524/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com