【问题标题】:MySQL query taking a long time on JoinMySQL 查询在 Join 上花费了很长时间
【发布时间】:2016-04-05 16:59:08
【问题描述】:

我有以下需要很长时间的mysql查询

SELECT `A`.*, max(B.timestamp) as timestamp2
FROM (`A`)
JOIN `B` ON `A`.`column1` = `B`.`column1`
WHERE `column2` =  'Player'
GROUP BY `column1`
ORDER BY `timestamp2` desc

我在 column1 上的表 A 上有索引,表 B 上的索引是 (column1,timestamp,column2),timestamp,column1。

当我使用 EXPLAIN 时,它不使用时间戳索引。

【问题讨论】:

  • 我在 MySQL 的优化器之前没有使用(首选)时间戳索引时遇到过问题。你试过giving it hints吗?

标签: php mysql join indexing


【解决方案1】:

尝试添加索引...

  ... ON `B` (`column2`,`column1`,`timestamp`)

按该顺序排列列。

没有任何关于数据类型的信息,我们将猜测column2 是字符类型(并且我们将假设该列在表B 中,给定有关当前索引的信息。)

没有任何有关基数的信息,我们将猜测满足column2(在 WHERE 子句中)上的相等谓词的行数是B 中总行数的一小部分。

我们预计 MySQL 将使用“范围”扫描操作,使用以column2 作为前导列的索引。

鉴于新索引是查询的“覆盖”索引,我们还希望 EXPLAIN 输出在 Extra 列中显示“使用索引”。

我们还期望 MySQL 可以使用索引来满足 GROUP BY 操作和 MAX 聚合,而不需要文件排序操作。

但我们仍然会看到一个文件排序操作,用于满足 ORDER BY。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多