次のクエリに問題があります。データベーステーブルからログレコードを選択します。非常に遅い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、それが実行するために20秒を必要として
- をdisplaygroupid(!)、そして私の試し中これを修正するには、(paymentlogテーブルの)transactionidカラムのINDEXを追加した後、60秒!
- 何らかの理由で、それは特定の行を複数回返した、と私はそれをすることによって、「paymentslog.logid BY GROUP」
を追加する固定このような理由のために私はそれに気づく必要があります:
- $ filterlogs_whereをPHP変数にはクエリのWHEREがあります(私はpaymentslogのためにphpの異なるフィルタを使ってビルドします)。 デフォルトでは、$ filterlogs_whereの値は「1 = 1」です。フィルタを適用する必要がある場合は、。=「AND paymentslog.userid = X」などを追加します。
とても遅いですか?
私は数秒またはミリ秒で実行されるより複雑なクエリを見て、書き込んだと思います。上記のクエリでなぜこの問題が発生するのですか?
ハッシュで結合することは可能ですが、整数だけで結合するほうがはるかに高速です。どのくらいのデータが話しているのか、あなたはそれを私たちに伝えていませんでした。 – Xorifelse
整数への結合は部分的に高速かもしれませんが、それだけです。関連するすべてのテーブルのCREATE TABLEステートメントと上記クエリのEXPLAINを使わないと、この問題を解決することはできません。 – Strawberry
@ Xorifelse - 'HASH'インデックスはありません。とにかく、ハッシュはBTreeよりわずかに速いだけです。 –