0

数日前、私のウェブサイトで永続的なクエリを実行していましたが、完了するまでに数分かかりました(約3回実行しました)

それは私のデータベースをほとんど殺してしまい、すべてが遅くなり1040 too many connections、いくつかのテーブルからデータを取得しようとしたときに得ました(たとえば、私のウェブサイトで最も使用されているテーブルであるセッションおよび設定テーブル-ほぼすべてのページがそれらを使用しています)、そして奇妙なことに、ウェブサイトからデータを取得しようとしていたのではなく、phpmyadmin からデータにアクセスしようとしていたのです。つまり、それらのテーブルに到達できませんでした

いずれにせよ、私はウェブサイトをダウンさせ、セッションテーブルを削除しましたが、どういうわけか修正されました(そのクエリを二度と実行したことのない治療法です)。

まず、これらのテーブルに追加するものを知りたいですか? それらは破損していましたか?接続制限に達したことは理解していますが、phpmyadmin内でそれを取得すべきではないと思いました

2 番目に重要なことは、エラーが発生しなくなったにもかかわらず、クエリの実行速度が大幅に低下したと感じていることです。何かをクリアまたは空にする必要があります!?

これがクエリです(各テーブルには約50〜60 000行あります)

SELECT 
u.id,  u.username , u.created_on , meta.full_name as fullname , meta.avatar , COUNT(s.val) as image_scores
FROM
   users u
       LEFT JOIN meta ON (u.id = meta.user_id)
       LEFT JOIN images i ON (u.id = i.user_id)
       LEFT JOIN score_history s ON (i.id = s.content_id)and s.content_type = 'image'
GROUP BY
   u.id
ORDER BY
   image_scores DESC
LIMIT 9
4

2 に答える 2

1

接続の問題が多すぎることがクエリの低速化の原因であるかどうかはわかりません。ただし、クエリが遅い理由を見つけるためのいくつかの提案があります。

  1. Explain を使用してクエリを実行します。[あなたの質問] を説明してください。これにより、どのインデックスが使用されているかを確認でき、インデックス作成が必要なフィールドを把握できます。
  2. テーブルが適切にインデックス化されていることを確認してください。users.id、meta.user_id、images.id、score_history.content_id、および content_type は、索引付けされるフィールドです。
  3. mysql サーバーでクエリ キャッシュが有効になっていることを確認します。

これとは別に、接続の問題が多すぎるのを避けるために、同じ接続を再利用するか、使用後は常に接続を閉じるようにしてください。

于 2013-05-31T11:00:26.357 に答える
0

を使用してこの問題を解決できますConnection Pooling

于 2013-05-31T10:33:53.320 に答える