ai didi

mysql - 使用 "OR"语句时Mysql索引出现问题

转载 作者:行者123 更新时间:2023-11-29 00:59:45 24 4
gpt4 key购买 nike

有什么方法可以为这个查询创建一个功能索引并摆脱“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)但仍然显示“Using where; Using filesort”。

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

有什么想法吗?谢谢。

最佳答案

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

approved, topcat1, topcat2, topcat3, id

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

你能发布CREATE TABLE吗?

根据用户消息进行编辑

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

关于mysql - 使用 "OR"语句时Mysql索引出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4118229/

24 4 0
文章推荐: sql inner join - 多列而不是行
文章推荐: mysql - 将 XML 文件数据填充到 Rails 中的数据库
文章推荐: php - JOIN 2 具有不同列的表
文章推荐: java - 填充数据库中的外键问题
行者123
个人简介

我是一名优秀的程序员,十分优秀!

滴滴打车优惠券免费领取
滴滴打车优惠券
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com