MySQL - very simple Join takes too much time

This is my first question on stackoverflow, and I am happy to be part of this community because it has helped me many times.

I am not an expert in SQL and MySQL, but I am working on a project that needs large tables (millions of rows). I have a problem making a connection and I don’t understand why so long . Thanks in advance:)

Here are the tables:

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)
);

Here is the query I want to make:

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;

This request takes too much time, and before executing it, I tried to check how long this simpler request has been running:

SELECT COUNT(*) FROM tabla_maestra tm
INNER JOIN tabla_actividades_empresas tae 
ON (tm.nombre!='' AND tae.empresa_apellido1=tm.empresa_apellido1);

It still takes too long and I don’t understand why. Here are the indexes I use:

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);

If I use the EXPLAIN operator, these are the following results:

http://oi59.tinypic.com/2zedoy0.jpg

, . , .

+4
3

, , , . count (*) , tabla_maestra, - cruce_empresa_apellido1.

, index_actividades_empresas (, ), empresa_apellido1 tabla_actividades_empresas.

, , , tabla_actividades_empresas tabla_maestra . , , , () .

+1

(. , ..) . ID ( , , , - MySQL AUTOINCREMENT).

tabla_actividades_empresas. empresa_apellido1 tabla_maestra, ?

, : tabla_actividades_empresas. maestra_id i.e.

, .

JOIN . :

UPDATE (SELECT * FROM tabla_maestra WHERE nombre != '') AS tm
INNER JOIN tabla_actividades_empresas AS tae
ON tae.empresa_apellido1 = tm.empresa_apellido1
SET tm.actividad = tae.actividad;

. , , .

... ? . UPDATE INNER JOIN LEFT JOIN, . ? , .

:

UPDATE tabla_maestra AS main, tabla_actividades_empresas AS aggr
SET main.actividad = aggr.actividad
WHERE main.empresa_apellido1 = aggr.empresa_apellido1
AND main.nombre <> ''

.

+1

.

, tabla_maestra - , , actividad ( ). , " id" - ( . , , ).

, auxiliar tabla_actividades_empresas ", . , . tabla_actividades_empresas, .

- " empresa_apellido1", .

" tabla_actividades_empresas.empresa_apellido1" , .

" tabla_actividades_empresas", " empresa_apellido1" UNIQUE " tabla_actividades_empresas ', " tabla_maestra" ( , ). , " tabla_actividades_empresas" , " tabla_maestra" .

, " "? , , .

0
source

All Articles