【问题标题】:Problem with Mysql index when using "OR" statement使用“OR”语句时Mysql索引出现问题
【发布时间】:2010-11-07 14:49:55
【问题描述】:

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

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)但仍然是“Using where; Using filesort”。

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

有什么想法吗?谢谢。

【问题讨论】:

    标签: mysql indexing filesort


    【解决方案1】:

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

    approved, topcat1, topcat2, topcat3, id
    

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

    你能发一下CREATE TABLE吗?

    根据用户消息进行编辑

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

    【讨论】:

    • Hammerite,这个表被一个叫做“厨房食谱”的脚本使用。每个配方可以属于(最多)3 个类别。因此,可能的 3 个类别有 3 列。例如,如果我使用 id 访问类别“主菜”,例如 6,则查询会扫描所有 3 列以检查 id 6 是否存在于第 1 列或第 2 列或第 3 列中。我可以发布 CREATE TABLE 但我不要认为这会有用。
    • 谢谢你,锤子。我按照您的建议创建了其他表格。现在一切看起来都正常,查询中不需要 "and approved='1' 因为类别表中不存在未批准的记录。
    猜你喜欢
    • 1970-01-01
    • 2018-05-15
    • 1970-01-01
    • 1970-01-01
    • 2011-02-19
    • 1970-01-01
    • 1970-01-01
    • 2012-08-05
    • 1970-01-01
    相关资源
    最近更新 更多