1

我有一个相当简单的 mysql 查询,其中包含一些内部联接,然后是 where 子句。我已经为连接中使用的所有列以及主键创建了索引。我还有一个包含 IN 运算符的 where 子句。当只有 5 个或更少的 id 被传递到 IN 子句时,查询优化器使用我的索引之一在合理的时间内运行查询。当我使用解释时,我看到类型是范围,键是 PRIMARY。我的问题是,如果我在 IN 子句中使用超过 5 个 id,优化器会忽略所有可用索引,并且查询运行速度非常慢。当我使用解释时,我看到类型是 ALL,键是 NULL。

有人可以说明这里发生的事情以及我如何解决这个问题。

谢谢

4

3 回答 3

0

在检查我遇到的类似问题时发现了这一点。认为我的发现可能会在将来帮助其他有类似问题的人。

我有一个大约 30 行的 MyISAM 表(包含类似单词的常见拼写错误,用于搜索,其中可能的原始拼写错误和替代单词都可能是有效的拼写,表格的大小会慢慢增加)。然而,对我来说,截止日期是如果 IN 子句中有 4 个项目,则使用索引,但是当 IN 子句中有 5 个项目时,索引将被忽略(注意我没有尝试过替代词,所以 IN 子句中的实际单个项目可能是一个因素)。与 OP 非常相似,但字数不同。

使用索引不起作用,索引仍然会被忽略。强制索引确实有效,尽管我更愿意避免指定索引(以防有人删除索引)。

对于一些测试,我用额外的 1000 个随机唯一行填充了表,即使 IN 子句中有 80 个项目,查询也会使用相关索引。

因此,MySQL 似乎根据 IN 子句中的项目数与表中的行数(可能还有其他一些因素在起作用)来决定是否使用索引。

于 2013-02-08T09:59:42.077 回答
0

无论表上的“主键”索引如何优化 JOIN,您还应该有一个基于您应用 WHERE 的通用标准的索引。您的查询列需要更多信息,但您的 WHERE 条件也应该有一个索引。

于 2013-01-23T14:59:24.623 回答
0

您也可以尝试使用 Mysql 索引提示。它允许您指定在查询执行期间应使用哪个索引。

例子:

 SELECT * FROM table1 USE INDEX (col1_index,col2_index)
  WHERE col1=1 AND col2=2 AND col3=3;

-

SELECT * FROM table1 IGNORE INDEX (col3_index)
  WHERE col1=1 AND col2=2 AND col3=3;

更多信息在这里: Mysql 索引提示

于 2013-01-23T15:43:27.103 回答