Mysql 为什么这个简单的左连接要花很长时间才能执行?
我在一个旧的mysql数据库上运行查询,许多查询花费的时间远远超过了它们应该花费的时间。例如,这一个,ad_车辆有60000行,id_ad_链接有25000行Mysql 为什么这个简单的左连接要花很长时间才能执行?,mysql,query-optimization,left-join,Mysql,Query Optimization,Left Join,我在一个旧的mysql数据库上运行查询,许多查询花费的时间远远超过了它们应该花费的时间。例如,这一个,ad_车辆有60000行,id_ad_链接有25000行 SELECT * FROM autotalk_identicar_old.ad_vehicle left join autotalk_identicar_old.id_ad_link on autotalk_identicar_old.ad_vehicle.vehiclekey=autotalk_identicar_old.id_ad_
SELECT * FROM autotalk_identicar_old.ad_vehicle
left join autotalk_identicar_old.id_ad_link on autotalk_identicar_old.ad_vehicle.vehiclekey=autotalk_identicar_old.id_ad_link.rbvehiclekey;
持续时间为2.323秒,在点击execute(使用mysql工作台,但不确定这是否有任何区别)后12分钟,fetch仍在继续。运行在一个虚拟机上,有我的amd四核3核@3.4ghz,1gb内存
我不认为有任何索引/主键,但是会有这么大的区别吗
ad_车辆的前几排
A145 00AA, PV, ALFA, 145, 2000, 3HBm, 1.6, , , , , P, , 5, 1596, , , 32995, , , 3HBm 1.6p
A145 00AB, PV, ALFA, 145, 2000, 3HBm, 1.7, , , , , P, , 5, 1712, , , 41995, , , 3HBm 1.7p
A145 01AA, PV, ALFA, 145, 2001, 3HBm, 1.6, , , , , P, , 5, 1596, , , 32995, , , 3HBm 1.6p
A145 01AB, PV, ALFA, 145, 2001, 3HBm, 1.7, , , , , P, , 5, 1712, , , 41995, , , 3HBm 1.7p
A145 02AA, PV, ALFA, 145, 2002, 3HBm, 1.6, , , , , P, , 5, 1596, , , 32995, , , 3HBm 1.6p
A145 02AB, PV, ALFA, 145, 2002, 3HBm, 1.7, , , , , P, , 5, 1712, , , 41995, , , 3HBm 1.7p
A145 95AA, PV, ALFA, 145, 1995, 3HBm, 1.6, , L, , , P, , 4, 1596, , , 32995, , , 3HBm 1.6p L
A145 95AB, PV, ALFA, 145, 1995, 3HBm, 1.7, ELEGANTE, L, , , P, , 4, 1712, , , 41995, , , 3HBm 1.7p ELEGANTE L
A145 96AA, PV, ALFA, 145, 1996, 3HBm, 1.6, , L, , , P, , 4, 1596, , , 32995, , , 3HBm 1.6p L
A145 96AB, PV, ALFA, 145, 1996, 3HBm, 1.7, ELEGANTE, L, , , P, , 4, 1712, , , 41995, , , 3HBm 1.7p ELEGANTE L
A145 97AA, PV, ALFA, 145, 1997, 3HBm, 1.6, , L, , , P, , 4, 1596, , , 32995, , , 3HBm 1.6p L
A145 97AB, PV, ALFA, 145, 1997, 3HBm, 1.7, ELEGANTE, L, , , P, , 4, 1712, , , 41995, , , 3HBm 1.7p ELEGANTE L
A145 98AA, PV, ALFA, 145, 1998, 3HBm, 1.6, , L, , , P, , 4, 1596, , , 32995, , , 3HBm 1.6p L
A145 98AB, PV, ALFA, 145, 1998, 3HBm, 1.7, ELEGANTE, L, , , P, , 4, 1712, , , 41995, , , 3HBm 1.7p ELEGANTE L
A145 98AC, PV, ALFA, 145, 1998, 4SDm, 2.5, , , , , P, , 5, 2492, , , 65998, , , 4SDm 2.5p
A145 99AA, PV, ALFA, 145, 1999, 3HBm, 1.7, ELEGANTE, L, , , P, , 4, 1712, , , 41995, , , 3HBm 1.7p ELEGANTE L
A145 99AB, PV, ALFA, 145, 1999, 3HBm, 1.6, , L, , , P, , 4, 1596, , , 32995, , , 3HBm 1.6p L
A146 00AA, PV, ALFA, 146, 2000, 5HBm, 1.6, , TS, , , P, , 5, 1596, , , 37995, , , 5HBm 1.6p TS
A146 01AA, PV, ALFA, 146, 2001, 5HBm, 1.6, , TS, , , P, , 5, 1596, , , 38995, , , 5HBm 1.6p TS
id\u ad\u链接的前几行
4 10 DHJT 94AA 1994 REDUNDANT HIJET
12 971 A33 95AA 1995 REDUNDANT ALFA33
13 971 A33 95AB 1995 REDUNDANT ALFA33
14 971 A33 95AC 1995 REDUNDANT ALFA33
61 973 A146 95AB 1995 REDUNDANT 146
60 973 A146 95AA 1995 REDUNDANT 146
59 973 A145 02AB 2002 REDUNDANT 145
58 973 A145 02AA 2002 REDUNDANT 145
57 973 A145 01AB 2001 REDUNDANT 145
56 973 A145 01AA 2001 REDUNDANT 145
55 973 A145 00AB 2000 REDUNDANT 145
54 973 A145 99AB 1999 REDUNDANT 145
53 973 A145 99AA 1999 REDUNDANT 145
52 973 A145 98AC 1998 REDUNDANT 145
45 973 A145 95AB 1995 REDUNDANT 145
44 973 A145 95AA 1995 REDUNDANT 145
70 973 A146 98AB 1998 REDUNDANT 146
71 973 A146 98AC 1998 REDUNDANT 146
72 973 A146 99AA 1999 REDUNDANT 146
73 973 A146 00AA 2000 REDUNDANT 146
更新:
这是测试的结果
explain SELECT * FROM autotalk_identicar_old.ad_vehicle
left join autotalk_identicar_old.id_ad_link on autotalk_identicar_old.ad_vehicle.vehiclekey=autotalk_identicar_old.id_ad_link.rbvehiclekey;
id, select_type, table, type, possible_keys, key, key_len, ref, rows, Extra
'1', 'SIMPLE', 'ad_vehicle', 'ALL', NULL, NULL, NULL, NULL, '60433', ''
'1', 'SIMPLE', 'id_ad_link', 'ALL', NULL, NULL, NULL, NULL, '25571', ''
尝试在外键上创建索引:
create index id_ad_link_rbvehiclekey_index on id_ad_link(rbvehiclekey);
如果没有此索引,每行ad\u车辆
将在id\u ad\u链接
有了索引,
ad_vehicle
的每一行都将导致访问一些索引页(可能在内存中),并读取一些页来获取连接的行,因为索引存储页以查找行
最小化磁盘I/O对性能至关重要,因为它至少比内存操作慢1000倍
索引会产生巨大的差异,尤其是在用于连接的列上(如外键)执行时,您可以发布这两个索引的结果吗<代码>描述车辆代码>和
DESC id\u ad\u链接
。此外,EXPLAIN SELECT*FROM autotalk_identicar_old.ad_vehicle left在autotalk_identicar_old.ad_vehicle.vehiclekey=autotalk_identicar_old.id_ad_link.rbvehiclekey上加入autotalk_identicar_old.id_ad_ad_链接代码>绝对,用于连接各个表的任何列上的索引都将提高性能。构建这些,然后再次尝试查询。编辑的问题的结果是“解释…”我能说的是哇。。。我曾听过对主键和索引的引用加速了数据库,但我从来没有想到会有如此巨大的差异!返回60819行|持续时间0.000获取1.108。谢谢你,好先生:)只是出于好奇,我假设MySQL会在处理它之前将整个表加载到内存中。。。考虑到这很容易是的,我知道你的意思。我不知道它在幕后使用了什么实现,但也许这只是它选择不做的事情