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

标签 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)但仍然显示“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/

相关文章:

java - hibernate 可滚动结果立即获取mysql中的所有行

MySQL和正确设置分区

php - 警告 : mysql_result() [function. mysql-结果] : Unable to jump to row 0 on MySQL result index 5 in profile. php 第 11 行

python - 在 Pytorch 中为子张量赋值

hibernate - 让 Hibernate 生成外键索引

mysql - 提高性能或重新设计 'greatest-n-per-group' mysql 查询

mysql - 在 MySQL 查询中使用 OR 时,有没有办法使用索引来避免文件排序?

php - 如何在 MySQL 查询中添加多个 OR

MySQL 不使用索引;使用文件排序

mysql - MySQL 中多列索引中的列顺序