【问题标题】:Making use of index in mysql join在mysql join中使用索引
【发布时间】:2018-04-11 17:56:42
【问题描述】:

我有一个 MySQL 表 T,并且列 c1 上有一个索引。我的join查询如下。

select something from T as t1 inner join T as t2 on ABS(t1.c1-t2.c1)<2;

我用explain来查看MySQL是否使用索引。它没有对上述查询使用索引。但它确实为以下查询使用了索引。

select something from T as t1 inner join T as t2 on t1.c1=t2.c1;

那么如何让 MySQL 在第一次查询时使用索引呢?

提前致谢。

【问题讨论】:

  • c1列是什么数据类型?
  • @lke c1 是一个浮点数。
  • 请向我们展示 (1) 带有 ike 建议修订的真实查询,(2) EXPLAIN SELECT ...,(3) SHOW CREATE TABLE。在这些输出之一中可能会出现一些微妙的东西。

标签: mysql join indexing query-optimization


【解决方案1】:

您需要删除围绕t2.c1 列的函数调用才能使用该列上的索引。

这样的查询应该适合你:

SELECT something
FROM T AS t1
INNER JOIN T AS t2 ON t2.c1 > (t1.c1 - 2) and t2.c1 < (t1.c1 + 2);

注意:这假设您在 c1 列上有一个索引。

【讨论】:

  • 这对于非整数可能不一样。你应该改用t2.c1 &gt; t1.c1 - 2 and t2.c1 &lt; t1.c1 + 2
  • @PaulSpiegel 谢谢,我什至没有想到!我会更新我的答案。
  • 三个查询都没有使用索引,但最快的一个是(从 T as t1 inner join T as t2 on ABS(t1.c1-t2.c1)
  • @Avinash142857 你的服务器版本是多少?
  • 如果只有几十行,索引就是浪费时间。优化器意识到这一点,并简单地扫描表。 (因此,Paul 的测试成功了,但(也许)Avinash 失败了。)
猜你喜欢
  • 2011-06-17
  • 1970-01-01
  • 2012-02-01
  • 2016-12-04
  • 2018-10-30
  • 2019-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多