2017-05-18 9 views
2

私のデータベースには、activity、contact、user、deleted_contactというテーブルがあります。重いデータベースでMySQLの4テーブルから行を取得する

  • アクティビティテーブルを5万行
  • 接触テーブルを5万行
  • を持っているユーザーの表は5000行
  • を持ってdelete_contactテーブルは今、私の問題は、そのとき、私850000行

ですましたを取得しようとしています。によってすべてのテーブルに参加しています、mysqlはあまりにも多くの負荷をとると私のアプリtotall yは動作を停止します。

左接合を適用しています。上記の4つのテーブルから10行だけを取ることをお勧めします。

は、私は次のクエリを持っている: -

SELECT activity.id, 
     activity.ipaddress, 
     deleted_contact.name, 
     activity.city, 
     activity.country, 
     activity.state, 
     activity.user_agent, 
     activity.browser_name, 
     activity.os_platform, 
     activity.details AS details, 
     activity.file_name AS filename, 
     activity.created_at AS Date, 
     activity.model_id, 
     activity.user_id, 
     activity.contact_id, 
     activity.type, 
     activity.city, 
     activity.state, 
     activity.country, 
     contact.name AS Contact, 
     email.subject AS emailsubject, 
     email.opened, 
     email.schedule_date, 
     email.schedule_timezone, 
FROM activity 
LEFT JOIN contact ON activity.contact_id = contact.id 
LEFT JOIN email ON activity.model_id = email.id 
LEFT JOIN user ON activity.user_id = user.id 
LEFT JOIN deleted_contact ON deleted_contact.contact_id = activity.contact_id 
WHERE activity.user_id IN (2, 
          56, 
          78, 
          93, 
          105, 
          2004, 
          345, 
          450, 
          321, 
          456) 
GROUP BY activity.id, 
     email.id 
ORDER BY activity.id DESC LIMIT 0, 
           10 
+4

インデックスを配置しているようなクエリやテーブル構造に関する情報を追加してください。 – Sirko

+0

どのくらい時間がかかりますか?mysqlでクエリを実行すると(アプリケーションではなく) –

+0

私のアクティビティテーブルIユニークでないuser_id上のインデックスを持つ、model_idは一意ではない、contact_idはユニークでない、通知はユニークではなく、created_atは一意ではない。 –

答えて

0

最終的に私はその答えを見つけました。実際にphpMyAdminでExplainクエリを実行したとき、アクティビティテーブルからそれらのユーザから26000行があり、クエリの最後にグループを適用するため、テンポラリテーブルが作成されていることがわかりました。だから私はグループを取り除いて、わずか0.26秒で非常に速い結果を得ました。

1

は、私はあなたのデータベースを知らないと、私は自分のコードを証明することはできませんが、アイデアは前にすべてのテーブルを結合、副選択で、この10行を選択しています。これは他の場合よりも速く動作するはずです。

SELECT act.id, 
     act.ipaddress, 
     deleted_contact.name, 
     act.city, 
     act.country, 
     act.state, 
     act.user_agent, 
     act.browser_name, 
     act.os_platform, 
     act.details AS details, 
     act.file_name AS filename, 
     act.created_at AS Date, 
     act.model_id, 
     act.user_id, 
     act.contact_id, 
     act.type, 
     act.city, 
     act.state, 
     act.country, 
     contact.name AS Contact, 
     email.subject AS emailsubject, 
     email.opened, 
     email.schedule_date, 
     email.schedule_timezone, 
FROM 
    (SELECT activity.id, 
     activity.ipaddress, 
     activity.city, 
     activity.country, 
     activity.state, 
     activity.user_agent, 
     activity.browser_name, 
     activity.os_platform, 
     activity.details AS details, 
     activity.file_name AS filename, 
     activity.created_at AS Date, 
     activity.model_id, 
     activity.user_id, 
     activity.contact_id, 
     activity.type, 
     activity.city, 
     activity.state, 
     activity.country 
     FROM activity WHERE activity.user_id IN (2,56,78,93,105,2004,345,450,321,456) AS act) 
LEFT JOIN contact ON act.contact_id = contact.id 
LEFT JOIN email ON act.model_id = email.id 
LEFT JOIN user ON act.user_id = user.id 
LEFT JOIN deleted_contact ON deleted_contact.contact_id = act.contact_id 
GROUP BY act.id, 
     email.id 
ORDER BY act.id DESC LIMIT 0,10 
+0

実際に私のライブサーバのphpmyadminで "Explain"キーワードを使用して直接クエリを試みたので、 "temporaryを使用する"、 "filesortを使用する"が "extra"の "activity table"実際には28700行で実行されています。だから私にお勧めします –

+0

実行時間と両方のバージョンの説明の説明を教えてください。だから私は見て、あなたに何かを伝えることができた。 – Rocio

関連する問題