【发布时间】:2015-03-13 10:54:50
【问题描述】:
我使用的是 MySQL 5.1.34,所有表都在 Innodb 引擎中。
我有 3 个表如下:
TableA (1M rows)
-ID (Auto Increment PK)
-TableB_ID
-Date varchar(indexed)
-Other Fields
TableB (60M rows)
-ID (Auto Increment PK)
-TableC_ID
-Other Fields
TableC (10M rows)
-ID (Auto Increment PK)
-Other Fields
我的目标是加入 3 个与 TableA 中的“日期”匹配的表。 “日期”列被索引,一个简单的 WHERE 子句可以在一秒钟内完成。例如
SELECT * FROM TableA where date = '2015-03-13';
10000 rows in set (0.1 sec)
但是,当我尝试使用下面的 SQL 连接 TableB 和 TableC 时,过程变得非常缓慢。
SELECT A.*, C.Something FROM TableA A JOIN TableB B on A.TableB_ID = B.ID JOIN TableC C on B.TableC_ID = C.ID WHERE A.date = '2015-03-13';
10000 rows in set (20 sec)
我尝试使用 EXPLAIN 命令解决缓慢问题,输出如下。
可能是什么原因?请帮忙!
【问题讨论】:
-
A.TableB_ID和B.TableC_ID是否已编入索引? -
@AbhikChakraborty 已编辑。抱歉,是的,A.TableB_ID 和 B.TableC_ID 都已编入索引。
-
@KarolyHorvath 磁盘搜索是什么意思?
-
@AbhikChakraborty 。 . .
B和C中的id列是主键,正如 OP 所说和explain中所示。不需要额外的索引。 -
@PeirHwa.Soo 。 . .第二次运行查询需要多长时间?您可能遇到冷缓存问题,将大约 20,000 页从磁盘读取到内存需要时间。