ホームページ  >  記事  >  バックエンド開発  >  インタビューの質問: MYSQL データベース クエリを最適化する方法について話す

インタビューの質問: MYSQL データベース クエリを最適化する方法について話す

WBOY
WBOYオリジナル
2016-08-08 09:19:39838ブラウズ

1. データ型を最適化する

MySQL には多くのデータ型があり、DBA であれば最適化の原則に従ってデータ型を厳密にチェックしますが、開発者は最も単純だと思うものを選択する場合があります。コーディングを高速化するためのオプション、または最も明白な選択肢を選択するため、最適な選択に直面しない可能性があるため、可能であれば、一般的なガイドラインを使用してこれらの決定を変更するようにしてください。

(1)NULLの使用を避ける

NULLはほとんどのデータベースで特別な処理を必要とし、MySQLも例外ではありません、より多くのコード、より多くのチェック、そして特別なインデックス作成ロジックを必要とする開発者もいます。テーブル作成時のデフォルト値ですが、ほとんどの場合、NOT NULL を使用するか、デフォルト値として 0、-1 などの特別な値を使用する必要があります。

(2) より小さいフィールドのみを使用することが可能です

MySQL はディスクからデータを読み取ってメモリに保存し、それを読み取るために CPU サイクルとディスク I/O を使用します。占有するデータ型が小さいほど、ディスクからの読み取りやメモリへのパックがより効率的になります。ただし、将来アプリケーションが変更された場合、スペースがなくなるため、データ型を減らすことにあまり固執しないでください。 。テーブルを変更するには再構築が必要になり、間接的にコード変更が発生する可能性があるため、バランスを見つける必要があります。

2. 文字セットの変換には注意してください

クライアントまたはアプリケーションで使用される文字セットは、実行中のプロセス中に暗黙的に変換する必要があります。 、UTF-8 などの文字セットがマルチバイト文字をサポートしていることを確認してください。そのため、より多くの記憶領域が必要になります。

3. count(my_col) と count(*) を最適化します

MyISAM テーブルを使用する場合、where 句なしで count(*) を使用すると、行数がカウントされるため、非常に高速になります。したがって、MySQL は行数を取得するために行ごとに検索しません。my_col 列に null 値がない場合、状況は前述と同じになります。つまり、count(my_col) は非常に高速になります。

where 句がある場合に count() を使用すると、基本的に、where 句内で明らかなインデックス列を超えることはできません。

上記の提案に加えて、サマリー テーブルを使用して、テーブルの内容を常に最新の状態に保つことも、実行することもできます。 1 つは定期的に、バッチ ジョブは最新のデータ情報を入力し続けます。後者の場合、バッチ ジョブの実行頻度に応じて、情報は正確ではなくなります。これは、アプリケーションの正確な情報の必要性と比較する必要があります。データを更新し続けるためのシステム オーバーヘッドには、この 2 つのバランスが必要です。

4. サブクエリを最適化する

サブクエリが発生した場合、MySQL クエリ最適化エンジンが常に最も効果的であるとは限らないのは、オプティマイザーがすでに接続クエリを正しく処理しているためです。もちろん、接続テーブル (2 番目のテーブル) の接続列にインデックスが付けられていることを確認する必要があります。通常、MySQL は 2 番目のテーブルに対してクエリ サブセットを実行します。これは、フル テーブル スキャンです。ネストされたループ アルゴリズムの一部。

5. UNION の最適化

複数の異なるデータベースにわたって UNION を使用することは、興味深い最適化方法です。つまり、データは重複しないようにする必要があります。並べ替え、特に大きなテーブルの並べ替えには非常にリソースが消費されることがわかっています。

UNION ALL を使用すると、プロセスを大幅に高速化できます。データに重複行が含まれないことがすでにわかっている場合、または重複行が表示されるかどうかを気にしない場合は、どちらの場合も UNION ALL を使用する方が適しています。さらに、アプリケーション ロジックでいくつかのメソッドを使用して行の重複を避けることができます。これにより、UNION ALL と UNION によって返される結果は同じになりますが、UNION ALL は並べ替えられません。

[ビットネットワーク]からの原文: http://soft.chinabyte.com/database/254/11335754.shtml

関連書籍

mysqlの最適化(mysqlで実行効率の低いSQL文をクエリする方法)

mysql 数千万レベルのデータベース内で同じ構造を持つ複数のテーブルに対して結合クエリを実行するにはどうすればよいでしょうか?クエリ速度を向上させるために最適化または設定するにはどうすればよいですか?

mysqlデータベース内の数千万のデータのクエリ最適化とページングテスト

mysql学習体験

Mysqlデータベースを最適化する8つの方法

上記はインタビューの質問を紹介しています。内容の側面を含め、MYSQL データベース クエリを最適化する方法について話しています。PHP チュートリアルに興味のある友人に役立つことを願っています。

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