1

有什么方法可以为这个查询创建一个有效的索引并摆脱“文件排序”?

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)但仍然是“使用位置;使用文件排序”。

我可以再创建一列,比如说“all_topcats”来将 topcat 数字存储在一个数组中 - 1、5、7,然后运行查询“... where $cid iIN ()...”。但问题是,在这种情况下,“all_topcats”列将是“varchar”,但“approved”和“id”列-int,无论如何都不会使用索引。

有任何想法吗?谢谢。

4

1 回答 1

1

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

approved, topcat1, topcat2, topcat3, id

了解表格的外观以及为什么您有三个这样命名的列会很有用。如果您有一个子表来存储 topcat 值,并带有返回主表的链接,那么组织一个好的查询可能会更容易,但是在不知道为什么要这样设置它的情况下,很难知道这是否明智.

可以发帖CREATE TABLE

编辑以响应用户消息

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

于 2010-11-07T15:03:46.333 回答