ヘルプディスカッション: データ量が少し大きい場合 (数十万アイテム)、結合テーブル クエリ/サブクエリ/PHP を使用した結果の段階的分析を使用した複数の単一テーブル クエリの長​​所、短所、およびオプション

WBOY
リリース: 2016-06-23 14:17:27
オリジナル
935 人が閲覧しました

mysql の最適化

まず私の現在のプロジェクトの状況について話させてください

メインテーブルには 400,000 のレコードがあり、それに関連付けられたほとんどのクエリは遅くなります (主キーインデックスは 3 秒以上かかります)。サブクエリが使用されているので、それを実行します。タイムアウト (30 秒) するか、10 秒以上続く場合もあります


ここで、PHP を使用して各ステップのクエリ結果を分析し、それらを文字列に組み立て、 in を使用してクエリを実行します。

例: 誰かがフォローしている人が投稿した Weibo をクエリします (メイン テーブルが Weibo テーブルであると仮定します)。まず誰かがフォローしている人を見つけて、uid を文字列に入力してから、 Weibo テーブル uid in (フォローしている人の文字列) ) こんな感じです

しかし、PHP の負荷が大幅に増加するなど、他の問題を引き起こすかどうかがまだ心配です

ウェブサイトはまだ宣伝されておらず、ユーザーが非常に少ないため、同時実行性とアクセス数が多い場合にどのような状況になるかは不明です


あなたの Web サイトでジョイント テーブル クエリやサブクエリを頻繁に使用している人はいますか?

お気軽に教えてください

ディスカッション(解決策)への返信

どんなに優れたデータベース設計であっても、基本はサブクエリであり、ジョイントクエリは避けて通れません。

しかし、通常のクエリには 3 秒かかりますし、サブクエリに 30 秒もかかるのは少し大げさすぎます。

テーブル構造を投稿して、一緒に話し合うこともできます。

結合クエリの左結合、右結合を使用することをお勧めします。

クエリを結合するときは、それらを 1 つずつ比較し、一致するとクエリが終了します。


select aid,b.name where tb1 a,tb2 b where a.id=b.id このメソッドは、まず tb1 と tb2 の結果をデカルト積に変換します。
次に、デカルト積の a.id=b.id を使用してエントリをフィルタリングします。これにより、効率が大幅に低下します。

したがって、左結合、右結合をさらに使用してください

結合クエリの左結合、右結合を使用することをお勧めします。

クエリを結合するときは、1 つずつ比較し、一致するとクエリが終了します。


select aid,b.name where tb1 a,tb2 b where a.id=b.id このメソッドは、まず tb1 と tb2 の結果をデカルト積に変換します。
次に、デカルト積の a.id=b.id を使用してエントリをフィルタリングします。これにより、効率が大幅に低下します。

したがって、左結合と右結合をもっと使用してください

結合クエリを使用するときは、最初に左結合を使用してから、これらの where 条件を使用します。これは競合しないはずです。

それを説明して分析してください

結合クエリを完全にキャンセルできない場合は、主にインデックスが適切に確立されているかどうか、および SQL がインデックスを適切に使用しているかどうかに依存します

構造と SQL を取り出して分析するのが最善です。それ

CPU 使用率とプロセスを追跡することをお勧めします

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!