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 사용 보고서는 다음과 같습니다
이것은 제가 시도한 다른 쿼리입니다.
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;
두 가지 모두 시도했지만 쿼리에 여전히 많은 시간이 걸립니다. 제안에 대한 감사합니다. –
쿼리는 얼마나 걸리나요? –
때로는 10 초 이상 ... 어떤 경우에는 18, 11, 32 등등 –