ホームページ データベース SQL SQL クエリを最適化するにはどうすればよいですか? (詳しい説明)

SQL クエリを最適化するにはどうすればよいですか? (詳しい説明)

Nov 30, 2019 pm 05:54 PM
SQLクエリ

SQL クエリを最適化するにはどうすればよいですか? (詳しい説明)

なぜ最適化する必要があるのか​​

システムのスループットのボトルネックは、データベースのアクセス速度に現れることがよくあります。つまり、アプリケーションが実行されるにつれて、データベース内のデータがますます増え、処理時間もそれに応じて遅くなります。さらに、データはディスクに保存されるため、読み取りおよび書き込みの速度は比較できません。

#最適化の方法

1. データベースを設計するとき: データベースのテーブルとフィールド、ストレージ エンジンの設計

2. Makeインデックスやステートメント記述の最適化など、MySQL 自体が提供する機能をうまく利用する

3. MySQL クラスター、サブデータベースとサブテーブル、読み取りと書き込みの分離

インターネットにはSQL ステートメントの最適化には多くの経験があるため、この記事ではこれらを脇に置き、DAO レイヤーとデータベース設計の最適化を試み、2 つの簡単な例を挙げます

例 1:ERPクエリの最適化

現状分析:

1. 関連するインデックスの欠如

2. Mysql 自体のパフォーマンスは限られており、複数のテーブルの関連付けはサポートされていません。現在のパフォーマンスは、多くのテーブルに関連付けられているリスト クエリに主に焦点を当てています

対策:

1 必要なインデックスを追加します: Explain を通じて実行レコードを表示し、指示に従ってインデックスを追加します。実行計画;

2 最初にビジネス データのメイン テーブルの主キーを数え、より小さい結果セットを取得してから、結果セット関連付けクエリを使用します;
1) 最初にクエリを実行し、その主キーを表示します。メイン テーブルと条件に基づくビジネス データ
2) 主キーをクエリ条件として使用し、他の関連テーブルを関連付けて、必要なビジネス フィールドをクエリします。
3) メイン テーブルをクエリするとき、クエリ条件の場合、他のテーブルと関連付ける必要がある場合は、この条件が設定されている場合にのみテーブルの関連付けを設定する必要があります。

例如 有如下表 TT_A   TT_B    TT_C  TT_D

假设未优化前的SQL是这样的

SELECT
    A.ID,
    ....
    B.NAME,
    .....
    C.AGE,
    ....
    D.SEX
    .....

FROM  TT_A A
LEFT JOIN TT_B B ON A.ID  = B.ITEM_ID
LEFT JOIN TT_C C ON B.ID = C.ITEM_ID
LEFT JOIN TT_D D ON C.ID = D.ITEM_ID
WHERE 1=1AND A.XX = ?AND A.VV = ?.....

那么优化后的SQL是

第一步

SELECT
    A.ID

FROM  TT_A A
WHERE 1=1AND A.XX = ?AND A.VV = ?第二步

SELECT
    A.ID,
    ....
    B.NAME,
    .....
    C.AGE,
    ....
    D.SEX
    .....
FROM  ( SELECT A.ID,..... FROM  TT_A  WHERE ID IN (1,2,3..)  ) A
LEFT JOIN TT_B B ON A.ID  = B.ITEM_ID
LEFT JOIN TT_C C ON B.ID = C.ITEM_ID
LEFT JOIN TT_D D ON C.ID = D.ITEM_ID
WHERE 1=1AND A.XX = ?AND A.VV = ?
ログイン後にコピー

概要:

この種の最適化は次のとおりです。リスト クエリの条件は一般にメイン テーブルにリンクされているため、これを使用してキー フィールド インデックスを確立し、同時にクエリ条件の制限によってメイン テーブルのデータ量を大幅に削減するため、リスト クエリに適しています。この方法では、他のテーブルを相関付けるときにはるかに高速になります。

例 2: 記事検索の最適化

Tieba の記事検索関数を作成するとします。最も単純かつ直接的な方法は、ストレージ構造として、リレーショナル データベースを使用して、記事を格納するためのリレーショナル データベース テーブル TT_ARTICLES を作成することです。

次に、現在の検索キーワードがが "target" の場合、文字列マッチングを使用して、CONTENT 列に対してマッチング クエリを実行できます。

select * from ARTICLES where CONTENT like '% 目标 %';
ログイン後にコピー
これにより、検索機能が簡単に実装されます。ただし、このアプローチには明らかな問題があります。つまり、文字列の一致に % を使用するのは非常に非効率であるため、そのようなクエリはテーブル全体を走査する必要があります (フル テーブル スキャン)。記事数が数、数十の場合は問題ありませんが、記事数が数十万、数百万となる場合、この方法はまったく実現できません。言うまでもなく、単一のリレーショナル データベース テーブルではこのような大規模なデータを収容できません。たとえ収容できたとしても、再度スキャンする必要があります。ここでの時間コストは想像を絶します


そこで、次のように導入する必要があります。 「反転」「インデックス」技術。上で説明したシナリオでは、この概念を 2 つの部分に分割して説明します: 上記の ARTICLES テーブルはまだ存在しますが、キーワード テーブル KEYWORDS を追加する必要があり、KEYWORD 列にインデックスを付ける必要があります。このキーワードはすぐに見つかります:

もちろん、KEYWORDS テーブルと ARTICLES テーブル、KEYWORD_ID と ARTICLE_ID を結合として結合するためのリレーションシップ テーブルも必要です。 主キー

#ご存知のとおり、これは実際には多対多の関係です。つまり、同じキーワードが複数の記事に出現する可能性があり、1 つの記事に複数の異なるキーワードが含まれる可能性があります。このようにして、まずインデックス付きキーワードに基づいて KEYWARDS テーブルから対応する KEYWORD_ID を見つけ、次に上記の関連付けテーブルに基づいて ARTICLE_ID を見つけ、それを使用して ARTICLES テーブル内の対応する記事を見つけることができます。

要約:

これは 3 回の検索のように見えますが、そのたびにインデックスが使用されるため、全テーブル スキャンが不要になります。 , 速度も遅くなく、SQLで実装するとこの処理を全てSQL文に落とし込むことができます。データ量が少ない場合は上記の方法で十分です。これにより、テーブル全体のスキャンと文字列 % 一致クエリによって引き起こされるパフォーマンスの問題が解決されます。

概要:

技術面接中に、実践的な例を挙げたり、開発プロセスの問題点や利点について直接話したりできる場合、面接は次のようになります。たくさん追加すると、答えはより論理的になるはずです。混乱しやすくなるため、あちこちに移動しないでください。たとえば、SQL を最適化する方法について尋ねられた場合、インデックスの追加について直接答えることはできません。次のように答えることができます:

こんにちは、インタビュアーさん、まず第一に、私たちのプロジェクト DB データ量がボトルネックに遭遇しました。その結果、リスト クエリが非常に遅くなり、ユーザーのエクスペリエンスが低下します。この問題を解決するには、次のような多くの方法があります。基本的なデータベーステーブルの設計、基本的な SQL の最適化、MYSQL クラスタリング、読み書きの分離、サブデータベースとサブテーブル、アーキテクチャへのキャッシュ層の追加など。それらの長所と短所...これらを組み合わせて、次のように組み合わせます。私たちのプロジェクトの特徴 最後に、テクノロジーを選択するときに選択します。

あなたがこれほど整然と理路整然と質問に答え、質問以外にも多くの知識ポイントについて話せば、面接官はあなたがただコードを書けるだけでなく、あなたは明確なロジックを持っています。あなたはテクノロジの選択について独自の理解と考え方を持っています。

この記事は SQL チュートリアル 列からのものです。ぜひ学習してください。

以上がSQL クエリを最適化するにはどうすればよいですか? (詳しい説明)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Meituan のインタビューでの質問: SQL が遅いと感じたことはありますか?どのように解決されましたか? Meituan のインタビューでの質問: SQL が遅いと感じたことはありますか?どのように解決されましたか? Aug 24, 2023 pm 03:41 PM

MySQL のスロークエリログは、MySQL が提供するログレコードで、MySQL のクエリ時間が設定したしきい値 (long_query_time) を超えた (超過した) ステートメントをスロークエリログに記録するために使用されます。

PHP と PDO: 複雑な SQL クエリを実行する方法 PHP と PDO: 複雑な SQL クエリを実行する方法 Jul 28, 2023 pm 03:43 PM

PHP と PDO: 複雑な SQL クエリ ステートメントを実行する方法 データベース操作を処理する場合、PHP はデータベースとの対話を簡素化する強力な拡張ライブラリ PDO (PHPDataObjects) を提供します。 PDO は、MySQL、SQLite などのさまざまなデータベースをサポートし、開発者がさまざまなデータベース操作を実行しやすくするための豊富な機能とメソッドも提供します。この記事では、PDO を使用して複雑な SQL クエリ ステートメントを実行する方法を紹介し、対応するコード例を添付します。データベースに接続する

PHPクエリ文の使用例 PHPクエリ文の使用例 Mar 23, 2024 am 11:27 AM

PHP は、Web 開発で広く使用されている強力なサーバーサイド スクリプト言語です。 Web 開発では、多くの場合、データベースと対話し、クエリ ステートメントを実行してデータを取得する必要があります。この記事ではPHPでのクエリ文の書き方と使用例を紹介します。 1. データベースに接続する PHP を使用してデータベースにクエリを実行する前に、まずデータベースとの接続を確立する必要があります。通常、例として MySQL データベースを使用します。データベースに接続するコードは次のとおりです: $servername=

PHP プログラミングにおける一般的なテーブル操作は何ですか? PHP プログラミングにおける一般的なテーブル操作は何ですか? Jun 12, 2023 am 09:46 AM

Web 開発では、テーブルは最も基本的で一般的に使用される要素であり、PHP は人気のあるサーバーサイド プログラミング言語であり、テーブル操作には多くの一般的なテクニックとメソッドがあります。この記事では、PHP プログラミングにおける一般的なテーブル操作を紹介します。データ テーブルの表示 PHP では、HTML で table タグを使用してデータ テーブルを表示できますが、テーブルは PHP スクリプトで生成する必要があることに注意してください。基本的な HTML テーブル タグの例を次に示します。 <table><tr>

SQL クエリを実行すると Go プログラムでエラーが発生するのはなぜですか? SQL クエリを実行すると Go プログラムでエラーが発生するのはなぜですか? Jun 09, 2023 pm 06:10 PM

Go プログラミングでは、SQL クエリの使用が一般的なタスクです。ただし、SQL クエリの実行時にエラーが発生し、プログラムが正しく実行されなくなる場合があります。これらのエラーを解決するには、SQL クエリと Go 言語がどのように相互作用するかを深く理解する必要があります。以下に、考えられるエラーとそれに対応する解決策をいくつか示します。データベースドライバーの不足 Go 言語では、データベースに接続して操作するには、特定のデータベースドライバーを使用する必要があります。データベース クエリを実行しようとしたときに、データベース ドライバーが正しくインストールおよび構成されていない場合

PHP 開発で SQL クエリ ステートメントとインデックスの使用を最適化するにはどうすればよいですか? PHP 開発で SQL クエリ ステートメントとインデックスの使用を最適化するにはどうすればよいですか? Nov 02, 2023 pm 12:12 PM

PHP 開発で SQL クエリ ステートメントとインデックスの使用を最適化するにはどうすればよいですか? PHP 開発では、データベース クエリは非常に一般的な操作です。ただし、データ量が増加すると、クエリのパフォーマンスが影響を受け、アプリケーションの速度が低下する可能性があります。クエリのパフォーマンスを向上させるには、SQL クエリ ステートメントとインデックスの使用を最適化する必要があります。この記事では、PHP 開発における SQL クエリのパフォーマンスを向上させるのに役立ついくつかの最適化のヒントとベスト プラクティスを紹介します。 1. 正しいインデックスを使用します。インデックスは、クエリのパフォーマンスを向上させるデータベースの重要な部分です。設計データ内で

PHP プログラミングにおけるほとんどの SQL クエリ効率の最適化実践 PHP プログラミングにおけるほとんどの SQL クエリ効率の最適化実践 Jun 23, 2023 am 10:37 AM

ネットワーク技術の発展に伴い、PHP プログラミングは多くの企業の Web サイト開発の主流になりました。 PHP プログラミングでは、SQL クエリの効率はすべてのプログラマーが注意を払い、対処する必要がある問題です。 SQL クエリが非効率的であると、Web サイトの応答が遅くなったり、システム負荷が高くなったり、その他の好ましくない影響が生じます。したがって、この記事では、プログラムの実行効率とシステム全体の応答速度を向上させるために、PHP プログラミングにおけるさまざまな SQL クエリ効率の最適化手法を紹介することに焦点を当てます。データベース インデックス データベース インデックスは、データベース クエリの速度を向上させる基本的な方法です。

PHP 言語開発における SQL クエリ エラーにどう対処するか? PHP 言語開発における SQL クエリ エラーにどう対処するか? Jun 09, 2023 pm 06:13 PM

PHP 言語は、Web サイト開発などの分野で一般的に使用されるサーバー側スクリプト言語です。 PHP言語開発においてSQLクエリは一般的な操作ですが、様々な理由によりSQLクエリでエラーが発生する場合があります。したがって、開発者はコード内でこれらのエラーを処理して、アプリケーションの安定性と正確性を確保する必要があります。一般に、PHP 言語で SQL クエリ エラーを処理するには、いくつかの一般的な方法があります: 1. try/catch ブロックを使用して例外を処理する PHP 言語では、try/catch を使用できます。

See all articles