使用“OR”语句时Mysql索引有问题

时间:2010-11-07 14:49:55

标签: mysql indexing filesort

有没有办法为这个查询创建一个正常运行的索引并摆脱“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。

有什么想法吗?感谢。

1 个答案:

答案 0 :(得分:1)

如果您重新排序索引中的列,则可以提高该查询的性能:

approved, topcat1, topcat2, topcat3, id

了解表格的外观以及为什么有三个这样的列名称会很有用。如果你有一个辅助表来存储topcat值,并且链接回到主表,可能会更容易组织一个好的查询,但是不知道为什么你设置它就像那样很难知道这是否合理

您可以发布CREATE TABLE吗?

编辑以响应用户消息

你的桌子听起来不像是设计得很好。以下设计会更好:添加两个新表CategoryCategory_Recipe(交叉引用表)。 Category将包含您的类别列表,Category_Recipe将包含两列,一列是Category的外键,另一列是现有Recipe表的外键。一行Category_Recipe是一个声明“此配方属于此类别”。然后,您将能够非常简单地编写将在给定类别中搜索配方的查询。您还可以将配方放在任意多个类别中,而不是限制为3.查找“数据库规范化”和“外键”。