MySQL - 非常简单的加入花费的时间太长

标签 mysql sql join indexing

这是我在 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/

相关文章:

sql - 基于前几个字符的情况

mysql - MySQL 中何时使用单引号、双引号和反引号

mysql - 如何使用distinct获取多对一关系mysql中的单条记录

php - 我正在尝试将 MySQL 中的数据显示到包含表的 PHP 页面上,但无法获取要在表内显示的信息

php - 如何连接其他表关联的多个表

php - MySQL 获取多个表,join

sql - 向sql查询添加额外字段

mysql - 为什么我在 Mysql 中得不到返回值?

php - PDO “Uncaught exception ' PDOException' .. 当其他无缓冲查询处于事件状态时无法执行查询。考虑使用 PDOStatement::fetchAll()。”

mysql - 从一个表中获取数据,并将该表中的每条记录插入到另一个表中