我遇到以下查詢問題。它從數據庫表中選擇日誌記錄。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
- 所有這些連接都需要對SELECT訪問線程ID除了與用戶表的連接來訪問用戶名,usergroupid和displaygroupid
- 它需要20秒運行(!),我嘗試在解決這個問題,在爲列transactionid(表paymentlog)添加INDEX之後,現在需要...... 60秒!
- 出於某種原因,這是多次返回特定行,基於這個原因,我固定它通過添加一個「GROUP BY paymentslog.logid」
我必須注意的是:
- $ filterlogs_where PHP變量具有查詢的WHERE(我通過php爲付款日誌創建了不同的過濾器)。 默認情況下,$ filterlogs_where的值爲「1 = 1」,如果我必須應用過濾器,則添加。=「AND paymentslog.userid = X」等。
任何想法爲什麼此查詢是如此之慢?
我想我已經看過並且寫了幾秒或幾毫秒內運行的更復雜的查詢。爲什麼這個問題與上面的查詢?
儘管加入哈希是可能的,但加入整數應該快很多。我們在談論多少數據,你忽略了告訴我們。 – Xorifelse
加入整數可能會更快一些,但就是這樣。如果沒有所有相關表的CREATE TABLE語句和針對上述查詢的EXPLAIN,不可能幫助解決這個問題 – Strawberry
@Xorifelse - 沒有'HASH'索引。無論如何,哈希只比BTree略快。 –