有没有办法为这个查询创建一个正常运行的索引并摆脱“filesort”?
SELECT id, title FROM recipes use index (topcat) where
(topcat='$cid' or topcat2='$cid' or topcat3='$cid')
and approved='1' ORDER BY id DESC limit 0,10;
我创建了索引“topcat”(列:topcat1 + topcat2 + topcat3 + approved + id)但仍然是“使用where;使用filesort”。
我可以创建一个列,比方说,“all_topcats”将topcat数字存储在数组中 - 1,5,7然后运行查询“...其中$ cid iIN()...”。但是探测是在这种情况下“all_topcats”列将是“varchar”但是“approved”和“id”列 - int,并且无论如何都不会使用index。
有什么想法吗?感谢。
答案 0 :(得分:1)
如果您重新排序索引中的列,则可以提高该查询的性能:
approved, topcat1, topcat2, topcat3, id
了解表格的外观以及为什么有三个这样的列名称会很有用。如果你有一个辅助表来存储topcat值,并且链接回到主表,可能会更容易组织一个好的查询,但是不知道为什么你设置它就像那样很难知道这是否合理
您可以发布CREATE TABLE
吗?
你的桌子听起来不像是设计得很好。以下设计会更好:添加两个新表Category
和Category_Recipe
(交叉引用表)。 Category
将包含您的类别列表,Category_Recipe
将包含两列,一列是Category
的外键,另一列是现有Recipe
表的外键。一行Category_Recipe
是一个声明“此配方属于此类别”。然后,您将能够非常简单地编写将在给定类别中搜索配方的查询。您还可以将配方放在任意多个类别中,而不是限制为3.查找“数据库规范化”和“外键”。