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

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 サイトの他の関連記事を参照してください。

声明
この記事はcnblogsで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
SQLの重要性:デジタル時代のデータ管理SQLの重要性:デジタル時代のデータ管理Apr 23, 2025 am 12:01 AM

データ管理におけるSQLの役割は、クエリ、挿入、更新、削除を介してデータを効率的に処理および分析することです。 1.SQLは、ユーザーが構造化された方法でデータベースと通信できるようにする宣言言語です。 2。使用例には、基本的な選択クエリと高度な参加操作が含まれます。 3.句の忘却や誤用の結合などの一般的なエラーは、説明コマンドを介してデバッグできます。 4。パフォーマンスの最適化には、インデックスの使用と、コードの読みやすさや保守性などのベストプラクティスに従うことが含まれます。

SQL:Essential Concepts and Skillsを開始しますSQL:Essential Concepts and Skillsを開始しますApr 22, 2025 am 12:01 AM

SQLは、リレーショナルデータベースを管理および操作するために使用される言語です。 1.テーブルの作成:CreateTableUsersなどのCreateTableステートメントを使用します(IdintPrimaryKey、NameVarchar(100)、EmailVarchar(100)); 2。データを挿入、更新、削除:InsertInto、更新、incertintintousers(id、name、email)values(1、 'johndoe'、 'john@example.com')などのステートメントを削除します。 3。クエリデータ:Selecなどの選択ステートメントを使用します

SQL:言語、MySQL:データベース管理システムSQL:言語、MySQL:データベース管理システムApr 21, 2025 am 12:05 AM

SQLとMySQLの関係は次のとおりです。SQLはデータベースの管理と操作に使用される言語であり、MySQLはSQLをサポートするデータベース管理システムです。 1.SQLは、CRUD操作とデータの高度なクエリを許可します。 2.MYSQLは、パフォーマンスとセキュリティを改善するためのインデックス、トランザクション、ロックメカニズムを提供します。 3. MySQLのパフォーマンスを最適化するには、クエリの最適化、データベースの設計、監視とメンテナンスに注意が必要です。

SQLが行うこと:データの管理と操作SQLが行うこと:データの管理と操作Apr 20, 2025 am 12:02 AM

SQLはデータベース管理とデータ操作に使用され、そのコア機能にはCRUD操作、複雑なクエリ、最適化戦略が含まれます。 1)CRUD操作:INSERTINTOを使用してデータを作成し、データの読み取りを選択し、データの更新を更新し、削除データを削除します。 2)複雑なクエリ:Groupbyを介して複雑なデータを処理し、条項を備えています。 3)最適化戦略:インデックスを使用し、完全なテーブルスキャンを避け、参加操作とページングのクエリを最適化してパフォーマンスを向上させます。

SQL:データ管理に対する初心者向けのアプローチ?SQL:データ管理に対する初心者向けのアプローチ?Apr 19, 2025 am 12:12 AM

SQLは、構文が単純で、機能が強力であり、データベースシステムで広く使用されているため、初心者に適しています。 1.SQLは、リレーショナルデータベースを管理し、テーブルを介してデータを整理するために使用されます。 2。基本操作には、データの作成、挿入、クエリ、更新、削除が含まれます。 3.結合、サブクエリ、ウィンドウ関数などの高度な使用法により、データ分析機能が強化されます。 4.一般的なエラーには、検査と最適化を通じて解決できる構文、ロジック、パフォーマンスの問題が含まれます。 5.パフォーマンス最適化の提案には、インデックスの使用、Select*の回避、説明の使用を使用してクエリの分析、データベースの正規化、コードの読み取り可能性の向上が含まれます。

SQL in Action:実際の例とユースケースSQL in Action:実際の例とユースケースApr 18, 2025 am 12:13 AM

実際のアプリケーションでは、SQLは主にデータクエリと分析、データ統合とレポート、データのクリーニングと前処理、高度な使用と最適化、複雑なクエリの処理と一般的なエラーの回避に使用されます。 1)データのクエリと分析を使用して、最も販売製品を見つけることができます。 2)データの統合とレポートは、参加操作を通じて顧客の購入レポートを生成します。 3)データのクリーニングと前処理は、異常な年齢記録を削除できます。 4)高度な使用と最適化には、ウィンドウ関数の使用とインデックスの作成が含まれます。 5)CTEと結合を使用して、SQLインジェクションなどの一般的なエラーを回避するために複雑なクエリを処理できます。

SQLおよびMySQL:コアの違いを理解しますSQLおよびMySQL:コアの違いを理解しますApr 17, 2025 am 12:03 AM

SQLはリレーショナルデータベースを管理するための標準言語であり、MySQLは特定のデータベース管理システムです。 SQLは統一された構文を提供し、さまざまなデータベースに適しています。 MySQLは軽量でオープンソースで、パフォーマンスは安定していますが、ビッグデータ処理にはボトルネックがあります。

SQL:初心者向けの学習曲線SQL:初心者向けの学習曲線Apr 16, 2025 am 12:11 AM

SQL学習曲線は急ですが、練習とコアの概念を理解することで習得できます。 1.基本操作には、選択、挿入、更新、削除が含まれます。 2。クエリの実行は、分析、最適化、実行の3つのステップに分けられます。 3.基本的な使用法は、従業員情報の照会など、Join Connection Tableの使用などです。 4.一般的なエラーには、エイリアスとSQLインジェクションの使用が含まれないことが含まれ、それを防ぐためにパラメーター化されたクエリが必要です。 5.パフォーマンスの最適化は、必要な列を選択し、コードの読みやすさを維持することにより達成されます。

See all articles

ホット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衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!