我遇到以下查询问题。它从数据库表中选择日志记录。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略快。 –