SELECT
mp_library.`lid` AS itemId,
mp_library.`cid` AS itemCategory,
mp_library.`photo` AS itemPhoto,
mpl_names.`name` AS itemName,
mp_users.`uid` AS userId
FROM mvc_public_library AS mp_library
INNER JOIN mvc_public_library_names AS mpl_names ON mpl_names.lid = mp_library.lid
LEFT JOIN mvc_public_wishlist AS mp_wishlist ON mp_wishlist.lid = mp_library.lid AND
mp_wishlist.uid = 31 AND mp_wishlist.status = "1"
LEFT JOIN mvc_public_users AS mp_users ON mp_users.uid = mp_wishlist.uid AND
mp_users. STATUS = "2"
WHERE
mp_library.status = "1" AND
mpl_names.language = "en" AND
mp_library.cid IN (3, 9967, 4, 20, 5, 9950, 6, 9971, 7, 9979, 12, 271, 272, 13, 2502, 2503, 15, 9925, 630, 778, ... , 3184)
ORDER BY mp_library.lid DESC
LIMIT 268320, 48
위의 쿼리는 IN (...) 섹션 안에 1000 ~ 3000 개의 ID가 있습니다. 내가 인덱스를 설정 한 모든 조인 된 테이블에서 큰 IN 목록, 큰 LIMIT 오프셋 및 ORDER BY로이 MySQL 쿼리 속도를 향상시킬 수 있습니까
:
는 문 출력을 설명한다. 쿼리의 지속 시간은 약 8 초이며 매우 긴 시간입니다. JOINS를 제거하고 SELECT * FROM mvc_public_library WHERE cid IN (...)
만 실행하면 쿼리에 3 초가 걸리고 다시 오랜 시간이 소요됩니다.
내가 쿼리 시간을 줄이기 위해 어떤 조치를 취할 수 있습니까? 나는이 목록에서 큰 문제 다른 게시물에서 발견 한 오프셋 큰 LIMIT가 문제가, 순서에 따라이 문제가 여기에 내가 3 :
@LATER의 편집이
나는 (목록 제외)이에 대한 쿼리를 좁힐 수있었습니다 :
SELECT mp_library.`lid` AS itemId,mp_library.`cid` AS itemCategory,mp_library.`photo` AS itemPhoto,mpl_names.`name` AS itemName,mp_users.`uid` AS userId
FROM mvc_public_library AS mp_library
INNER JOIN mvc_public_library_names AS mpl_names ON mpl_names.lid = mp_library.lid
LEFT JOIN mvc_public_wishlist AS mp_wishlist ON mp_wishlist.lid = mp_library.lid AND
mp_wishlist.uid = 31 AND
mp_wishlist.status = "1"
LEFT JOIN mvc_public_users AS mp_users ON mp_users.uid = mp_wishlist.uid AND
mp_users.status = "2"
WHERE 1 AND mp_library.status = "1" AND
mpl_names.language = "ro"
ORDER BY mp_library.lid DESC
LIMIT 268320,48
또한 내가 @DRapp이 제안 굴절률들 추가 5 초 8 초 개선을 가지고 있습니다. 나는 그것이 더 향상 될 수 있는지 궁금해하고 있었다. 다음은 새로운 쿼리에 대한 설명입니다.
'order by'을 삭제하면 얼마나 걸리나요? 동일한 '제한', 다른 모든 것과 동일합니다. 질문에 표에 색인을 나열 할 수 있습니까? –
거의 같아요. 0.5/1 초 향상 만 있습니다. – Bogdan
나를 위해, 선택한 키가 대개 제한적이지 않은 '상태'라는 것이 이상합니다. – Pentium10