다음 쿼리에 문제가 있습니다. 데이터베이스 테이블에서 로그 레코드를 선택합니다.매우 느린 MySQL 쿼리 (20 ~ 60 초!) - 왜?
SELECT paymentslog.*, user.username, user.usergroupid, user.displaygroupid,
purchase_temp.threadid
FROM " . TABLE_PREFIX . "paymentslog AS paymentslog
LEFT JOIN " . TABLE_PREFIX . "user AS user
ON (paymentslog.userid = user.userid)
LEFT JOIN " . TABLE_PREFIX . "paymenttransaction AS paymenttransaction
ON (paymentslog.transactionid = paymenttransaction.transactionid)
LEFT JOIN " . TABLE_PREFIX . "paymentinfo AS paymentinfo
ON (paymenttransaction.paymentinfoid = paymentinfo.paymentinfoid)
LEFT JOIN " . TABLE_PREFIX . "purchase_temp AS purchase_temp
ON (paymentinfo.hash = purchase_temp.hash) $filterlogs_where
GROUP BY paymentslog.logid
ORDER BY paymentslog.dateline DESC
LIMIT $startat, $perpage
- 모든 사용자 이름, usergroupid에 액세스하는 사용자 테이블과 조인을 제외하고 SELECT에 threadid에 액세스하는 데 필요한 및 displaygroupid 조인 이 (!)를 실행하기 위해 20 초 필요, 내 시도하는 동안 한 그것을 해결하기 위해 (테이블 paymentlog의) transactionid 열에 대한 INDEX를 추가 한 후, 이제 60 초가 필요합니다! 어떤 이유로
- , 그것은 특정 행를 여러 번 돌려, 그리고 이런 이유로 나는 그 통지해야 그것이하여
"paymentslog.logid에 의해 GROUP"는 추가 수정 :
- $ filterlogs_where PHP 변수에는 쿼리의 WHERE가 있습니다 (저는 paymentslog에 대해 php 다른 필터를 통해 빌드합니다). 기본적으로 $ filterlogs_where의 값은 "1 = 1"이며, 필터를 적용해야한다면. = "AND paymentslog.userid = X"등을 추가합니다.
너무 느린가요?
필자는 몇 초 또는 밀리 초 내에 실행되는 더 복잡한 쿼리를보고 작성했다고 생각합니다. 위 질문에 왜이 문제가 있습니까?
해시에 참여할 수 있지만 정수에 가입하는 것이 훨씬 빠릅니다. 우리가 얼마나 많은 데이터를 말하고 있는지, 당신은 그 사실을 우리에게 말하지 않았습니다. – Xorifelse
정수 결합은 부분적으로 빠를 수도 있지만 그게 전부입니다. 모든 관련 테이블에 대한 CREATE TABLE 문과 위의 쿼리에 대한 EXPLAIN이 없으면이 문제를 해결하는 것이 불가능합니다. – Strawberry
@ Xorifelse - 'HASH'인덱스가 없습니다. 어쨌든 해시는 BTree보다 약간 빠릅니다. –