这是我在 stackoverflow 中的第一个问题,我很高兴成为这个社区的一员,因为它帮助了我很多次。
我不是 SQL 和 MySQL 方面的专家,但我正在从事一个需要大表(百万行)的项目。 我在进行连接时遇到问题,我不明白为什么要花这么长时间。提前致谢:)
这是表格:
CREATE TABLE IF NOT EXISTS tabla_maestra(
id int UNIQUE,
codigo_alta char(1),
nombre varchar(100),
empresa_apellido1 varchar(150),
apellido2 varchar(50),
tipo_via varchar(20),
nombre_via varchar(100),
numero_via varchar(50),
codigo_via char(5),
codigo_postal char(5),
nombre_poblacion varchar(100),
codigo_ine char(11),
nombre_provincia varchar(50),
telefono varchar(250) UNIQUE,
actividad varchar(100),
estado char(1),
codigo_operadora char(3)
);
CREATE TABLE IF NOT EXISTS tabla_actividades_empresas(
empresa_apellido1 varchar(150),
actividad varchar(100)
);
这是我要执行的查询:
UPDATE tabla_maestra tm
INNER JOIN tabla_actividades_empresas tae
ON (tm.nombre!='' AND tae.empresa_apellido1=tm.empresa_apellido1)
SET tm.actividad=tae.actividad;
这个查询花费的时间太长,在执行它之前我试图测试这个更简单的查询需要多长时间:
SELECT COUNT(*) FROM tabla_maestra tm
INNER JOIN tabla_actividades_empresas tae
ON (tm.nombre!='' AND tae.empresa_apellido1=tm.empresa_apellido1);
它仍然花费太长时间,我不明白为什么。以下是我使用的索引:
CREATE INDEX cruce_nombre
USING HASH
ON tabla_maestra (nombre);
CREATE INDEX cruce_empresa_apellido1
USING HASH
ON tabla_maestra (empresa_apellido1);
CREATE INDEX index_actividades_empresas
USING HASH
ON tabla_actividades_empresas(empresa_apellido1);
如果我使用 EXPLAIN 语句,结果如下:
http://oi59.tinypic.com/2zedoy0.jpg
如果收到任何可以帮助我的答案,我将不胜感激。非常感谢, 丹妮。
最佳答案
如您的查询计划所示,涉及 50 万行的连接必然需要一些时间。 count(*) 查询更快,因为它不需要读取 tabla_maestra
表本身,但它仍然需要扫描索引 cruce_empresa_apellido1
的所有行。
如果您将索引 index_actividades_empresas
设为唯一 索引(假设这确实是合适的),或者如果您删除该索引并将列设为 empresa_apellido1,这可能会对某些人有所帮助
表 tabla_actividades_empresas
的主键。
如果即使那样也不能给你足够的性能,那么我唯一要做的就是给表 tabla_actividades_empresas
一个整数类型的合成主键,并更改 tabla_maestra 的相应列匹配。这应该会有所帮助,因为将整数与整数进行比较比将字符串与字符串进行比较要快,即使您可以通过散列过滤掉(大多数)不匹配项也是如此。
关于MySQL - 非常简单的加入花费的时间太长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26426374/