이것은 내 질문입니다.
SELECT
content.*,
mpt.asiakas.*,
(
SELECT GROUP_CONCAT(t20.asryhma) FROM context t20
WHERE t20.asryhma <> 0 AND t20.asiakas = content.content_id)
AS asryhma
FROM content JOIN mpt.asiakas ON content.resource_id = mpt.asiakas.as_id
WHERE content.content_type_id = 27
ORDER BY mpt.asiakas.as_k2 DESC, mpt.asiakas.as_os DESC, mpt.asiakas.as_vat ASC LIMIT 0,10
content
소유자 정보, 타임 스탬프 및 기타 많은 테이블에 대한 일반적인 정보를 포함하는 콘텐츠 테이블 (~ 2 만 행)입니다. mpt.asiakas
실제 콘텐츠 데이터가있는 곳 (~ 14k 행)이므로이 두 데이터가 먼저 결합됩니다. 이 디자인은 중복성을 줄여야합니다. context
더 나은 용어가 부족한 경우-조인 할당 테이블 (~ 3k 행)입니다. 패치 베이처럼 작동합니다.
이제 정렬 부분이나 하위 쿼리를 주석 처리하면 쿼리를 실행하는 데 약 0.01 초가 걸립니다. 그러나 둘 다 있으면 쿼리를 실행하는 데 약 17 초가 걸리며 이는 너무 많은 것입니다. 이것에 대해 무엇을 할 수 있는지 궁금합니다.
GROUP_CONCAT가 수행되는 행을 제한하려면이 쿼리를 다음과 같이 다시 작성하십시오.
SELECT t.*,
(
SELECT GROUP_CONCAT(t20.asryhma) FROM context t20
WHERE t20.asryhma <> 0 AND t20.asiakas = t.content_id
) AS asryhma
FROM (
SELECT
content.*,
mpt.asiakas.*
FROM content
JOIN mpt.asiakas ON content.resource_id = mpt.asiakas.as_id
WHERE content.content_type_id = 27
ORDER BY mpt.asiakas.as_k2 DESC,
mpt.asiakas.as_os DESC,
mpt.asiakas.as_vat ASC
LIMIT 0,10
) AS t
현재 MySql 최적화 프로그램 (버전 5.7 이하)은 ASC / DESC 순서가 혼합 된 쿼리를 최적화 할 수 없기 때문에 인덱스를 사용하여 ORDER BY 절을 최적화 할 수 없습니다.
자세한 내용은 다음 링크를 참조하십시오.
http://dev.mysql.com/doc/refman/5.7/en/order-by-optimization.html
경우에 따라 MySQL은 인덱스를 사용하여 ORDER BY를 확인할 수 없지만 여전히 인덱스를 사용하여 WHERE 절과 일치하는 행을 찾습니다.
이러한 경우에는 다음이 포함됩니다.
.....
.....-
ASC와 DESC를 혼합합니다.
SELECT * FROM t1 ORDER BY key_part1 DESC, key_part2 ASC;
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다