2014-03-12 1 views
2
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가 있습니다. 내가 인덱스를 설정 한 모든 조인 된 테이블에서 enter image description here큰 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 초 개선을 가지고 있습니다. 나는 그것이 더 향상 될 수 있는지 궁금해하고 있었다. 다음은 새로운 쿼리에 대한 설명입니다. enter image description here

+1

'order by'을 삭제하면 얼마나 걸리나요? 동일한 '제한', 다른 모든 것과 동일합니다. 질문에 표에 색인을 나열 할 수 있습니까? –

+0

거의 같아요. 0.5/1 초 향상 만 있습니다. – Bogdan

+0

나를 위해, 선택한 키가 대개 제한적이지 않은 '상태'라는 것이 이상합니다. – Pentium10

답변

1

mp_library(status, cid)에 대한 인덱스가 필요하다고 생각됩니다. 일초 개선이 경우

create index on mp_library(status, cid, lid, photo) 
+0

제안한 색인이 1 초 단축됩니다. – Bogdan

+0

MySQL은 조회를 위해 'cid'색인을 사용하지 않을 것입니다. 'status'= 1 인 모든 행을 검색하고 각 행을 IN 절의 값 목록과 비교하는 것이 좋습니다. –

1

내가, 내가 약간 다시 한 등 또한

table      index 
mvc_public_library  (status, cid, lid, photo) 
mvc_public_library_names (lid, language, `name`) 
mvc_public_wishlist  (lid, uid, status) 
mvc_public_users   (udi, status) 

모든 테이블에 인덱스를 덮고 있고 것이다 : 사실, 다음 인덱스는 쿼리를 포함 할 더 좋지는 않지만 키워드를 추가하겠습니다.

SELECT STRAIGHT_JOIN ... rest of your query. 
+0

귀하의 제안과 함께, 속도가 8 초에서 5 초 갔다. 비록 내가 2 ~ 3 초 또는 그와 비슷한 것보다 더 낮을 수 있는지에 대해 궁금해했다. (STRAIGHT_JOIN은 5 초 동안 아무런 개선도하지 못했습니다.) – Bogdan

+0

@Bogdan, 1000 - 3000 IN 목록과 함께, 엔진이 필요하지 않도록 번호순으로 목록을 준비하고 있습니다. 그것이 앞뒤로 가도록 강제된다면? 나는 모른다. – DRapp

+0

쿼리에서 목록을 제거 했으므로 변경 사항을 반영하기 위해 첫 번째 게시물을 업데이트했습니다. – Bogdan

관련 문제