我目前正在尝试执行的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] => ) )
答案 0 :(得分: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中的总行数是多少,您期望与此特定查询匹配的行数是多少?