2

我目前正在尝试执行的 MySQL 查询在功能上等同于:

SELECT small_table.A, small_table.B, small_table.C, huge_table.X, huge_table.Y
FROM small_table LEFT JOIN huge_table
ON small_table.D = huge_table.Z
WHERE small_table.E = 'blah'

除了查询似乎没有终止(至少不是在合理的时间内),可能是因为第二个表很大(即 7500 行,总大小为 3 MB)。我可以在合理的时间内执行功能等效的连接,还是需要通过将大表中的列添加到小表中来引入冗余。(我是 SQL 的初学者。)

该子句WHERE small_table.E = 'blah'是静态的,'blah'永远不会改变。

这是请求的 EXPLAIN 输出:

Array ( [0] => Array ( [0] => 1 [id] => 1 [1] => SIMPLE [select_type] => SIMPLE [2] => small_table [table] => small_table [3] => ref [type] => ref [4] => E [possible_keys] => E [5] => E [key] => E [6] => 1 [key_len] => 1 [7] => const [ref] => const [8] => 1064 [rows] => 1064 [9] => Using where [Extra] => Using where ) [1] => Array ( [0] => 1 [id] => 1 [1] => SIMPLE [select_type] => SIMPLE [2] => huge_table [table] => huge_table [3] => eq_ref [type] => eq_ref [4] => PRIMARY [possible_keys] => PRIMARY [5] => PRIMARY [key] => PRIMARY [6] => 4 [key_len] => 4 [7] => my_database.small_table.D [ref] => my_database.small_table.D [8] => 1 [rows] => 1 [9] => [Extra] => ) )

4

1 回答 1

2

一些东西 ...

1)您是直接在 MySQL(Workbench GUI 或命令行)中执行此查询,还是此查询嵌入在 PHP 代码中?您的 EXPLAIN 输出似乎建议使用 PHP。如果您还没有这样做,请尝试直接在 MySQL 中执行查询并将 PHP 排除在外。

2)您的 EXPLAIN 输出看起来不错,除了我想知道您的WHERE子句与small_table.E = 'blah'. EXPLAIN 输出显示列上有索引,E但键长度 = 1,这与与'blah'. 您为列定义使用了什么数据类型small_table.E

3) MySQL 估计需要扫描 small_table 中的 1064 行。small_table 中总共有多少行,您希望有多少行应该匹配这个特定的查询?

于 2012-08-07T07:04:00.730 回答