私は、ほぼ4000レコードのリレーショナルMySQLデータベースを持っています。連絡先テーブルは、多人数対多の関係を持つキーワードテーブルとメモテーブルの両方に関連しています。私は、各連絡先レコードと、各連絡先に対して、グループconcat関数内のすべての関連するメモとキーワードを取得するクエリ(PHPを使用)を書いています。連絡先だけを取得すると、クエリは比較的速く実行されますが、2つの左の結合とグループの連結では、ほぼ30秒かかります。これをスピードアップする方法はありますか?パフォーマンスに影響を与える複数の結合によるSQLクエリ
SELECT c.*, GROUP_CONCAT(DISTINCT n.id, '[-]', n.value, '' SEPARATOR '---') as notes,
GROUP_CONCAT(DISTINCT kk.id, '[-]', kk.value) as keywords
FROM contacts c
LEFT JOIN notes n ON c.id LIKE n._contactID
LEFT JOIN
(SELECT k.*, kc._contactID as contactID
FROM keywords k
INNER JOIN keywords_contacts kc ON k.id LIKE kc._keywordID
) kk ON kk.contactID LIKE c.id
GROUP BY c.id
ORDER BY c.`Last Name`, c.`First Name`
データベースにインデックスを設定しましたか?インデックスがクエリを高速化する可能性があります。 –
私の考え方によれば、SQLでは、GROUP_CONCATが回答の一部を形成する必要はありません。特に、アプリケーションレベルのコードで作業する場合は問題ありません。スピードの鍵はインデックスにありますが、私たちがそれに着手する前に、適切なCREATEとINSERTステートメントを希望の結果と一緒に提供することを検討してください。 – Strawberry
@Strawberry Hareshのソリューションを使用して問題を解決している間、私はあなたのコメントを理解したい。分析して遊ぶことができるコードサンプルを提供できると思いますか? –