2014-10-24 6 views
1

http://goo.gl/1nr3s2, http://goo.gl/gv4Vlc 및 기타 stackoverflow 관련 질문을 읽었지만 그 중 아무 것도이 문제를 해결하지 못했습니다.MySQL 범위 쿼리가 느립니다.

이 문제는 여러 테이블과 상호 작용하지만 EXPLAIN 메서드는 범위가 쿼리의 주된 문제인지 식별하는 데 도움이됩니다.

먼저 나는

+-------+----------+----------------+--------------+---------------+----------------+ 
    | marca | submarca | modelo_inicial | modelo_final | motor   | texto_articulo | 
    +-------+----------+----------------+--------------+---------------+----------------+ 
    | Buick | Century |   1993 |   1996 | 4 Cil 2.2 Lts | BE1254AG4  | 
    | Buick | Century |   1993 |   1996 | 4 Cil 2.2 Lts | 854G4   | 
    +-------+----------+----------------+--------------+---------------+----------------+ 

이 표는 150 만 개 이상의 행이 내가 가지고 (I 과정을 단순화하기 위해 모든 테이블에 ID를 사용하지 않습니다)이 샘플 데이터로이 테이블을 가지고 설명 할 필요 initial_year와 end_year를 하나로 통합하는 인덱스를 생성했으며 initial_year는 인덱스를 가지고 end_year는이 구조와 독립적으로 다른 인덱스를가집니다.

+---------+----------------+ 
| id_modelo | texto_modelo | 
+-----------+--------------+ 
|  76 |  2014 | 
|  75 |  2013 | 
............................ 
|  1 |  1939 | 
+-----------+--------------+ 

내가 특정 데이터를 얻기 위해 하위 쿼리를 포함하는 쿼리를 만들었지 만 많은 시간을했다 :

CREATE TABLE `general` (
    `id_general` int(11) NOT NULL AUTO_INCREMENT, 
    `id_marca_submarca` int(11) NOT NULL, 
    `id_modelo_inicial` int(11) NOT NULL, 
    `id_modelo_final` int(11) NOT NULL, 
    `id_motor` int(11) NOT NULL, 
    `id_articulo` int(11) NOT NULL, 
    PRIMARY KEY (`id_general`), 
    KEY `fk_general_articulo` (`id_articulo`), 
    KEY `modelo_inicial_final` (`id_modelo_inicial`,`id_modelo_final`), 
    KEY `indice_motor` (`id_motor`), 
    KEY `indice_marca_submarca` (`id_marca_submarca`), 
    KEY `indice_modelo_inicial` (`id_modelo_inicial`), 
    KEY `indice_modelo_final` (`id_modelo_final`), 
    CONSTRAINT `fk_general_articulo` FOREIGN KEY (`id_articulo`) REFERENCES `articulo` (`id_articulo`) ON DELETE CASCADE 
) ENGINE=InnoDB AUTO_INCREMENT=1191853 DEFAULT CHARSET=utf8 

나는이 샘플 데이터와 같은 다른 년을 포함하는 다른 테이블이 있습니다. 나는 시도했지만 그들 중 누구도 나를

SELECT DISTINCT M.texto_modelo 
FROM general G 
INNER JOIN parque_vehicular.modelo M ON G.id_modelo_inicial <= M.id_modelo AND G.id_modelo_final >= M.id_modelo 
WHERE EXISTS 
(
    SELECT DISTINCT A.id_articulo 
    ...subquery... 
    WHERE A.id_articulo = G.id_articulo AND AD.id_distribuidor = 1 
) 
ORDER BY M.texto_modelo DESC; 

제대로 일하지 않은 그리고이 쿼리는 초 많이했다 일부 쿼리 둘 것이다, 그래서 EXPLAIN 사용 보고서는 다음과 같습니다

enter image description here

이것은 제가 시도한 다른 쿼리입니다.

SELECT DISTINCT M.texto_modelo 
FROM general G 
INNER JOIN parque_vehicular_rigs.modelo M ON M.id_modelo BETWEEN G.id_modelo_inicial AND G.id_modelo_final 
WHERE EXISTS 
(
    SELECT DISTINCT A.id_articulo 
    ...subquery  WHERE A.id_articulo = G.id_articulo AND AD.id_distribuidor = 1 
) 
ORDER BY M.texto_modelo DESC; 

답변

0

쿼리 계획을 변경 할 수있는 일부 작업 :

  • OP1

    : 테이블 general에있는 모든 키 또는 인덱스를 제거하십시오.
  • OP2 : EXISTS의 하위 쿼리에서 SELECT DISTINCT A.id_articulo 대신 SELECT 1을 사용하십시오.

이러한 작업을 따로 수행하여 차이점을 비교하십시오.

+0

두 가지 모두 시도했지만 쿼리에 여전히 많은 시간이 걸립니다. 제안에 대한 감사합니다. –

+0

쿼리는 얼마나 걸리나요? –

+0

때로는 10 초 이상 ... 어떤 경우에는 18, 11, 32 등등 –

관련 문제