1 データ型を最適化する
。MySQL には多くのデータ型があります。DBA であれば、最適化の原則に従ってデータ型を厳密にチェックしますが、開発者はコーディングを高速化するために最も簡単だと思うソリューションを選択することも、最も多くのデータ型を選択することもできます。したがって、直面する可能性のある明白な選択が最善の選択ではないため、可能であれば、一般的なガイドラインを使用してこれらの決定を変更するように努める必要があります。
(1) NULLの使用を避ける
NULL はほとんどのデータベースで特別な処理を必要とし、MySQL も例外ではありません。一部の開発者は、テーブルを作成するときに NULL がデフォルト値であることをまったく認識していません。 NOT NULL を使用するか、0、-1 などの特別な値をデフォルト値として使用する必要があります。
(2) より小さいフィールドのみを使用できます
MySQL はディスクからデータを読み取った後、それをメモリに保存し、それを読み取るために CPU サイクルとディスク I/O を使用します。これは、データ型が小さいほど、占有するスペースが小さくなるということを意味します。ディスクから読み取られるか、メモリにパックされると効率が良くなりますが、将来アプリケーションに変更があった場合は、スペースがなくなるため、あまり気にしないでください。テーブルを変更するには再構築が必要になり、間接的にコードが変更される可能性があるため、バランスを見つける必要があります。
2. 文字セットの変換に注意してください
クライアントやアプリケーションが使用する文字セットは、テーブル自体の文字セットと異なる場合があります。これには、MySQL が実行プロセス中に暗黙的に変換する必要があります。また、UTF- などの文字セットかどうかを判断する必要があります。 8 はマルチバイト文字をサポートするため、より多くの記憶領域が必要になります。
3. count(my_col) と count(*) を最適化します
MyISAM テーブルを使用する場合、where 句なしで count(*) を使用すると、行数の統計が非常に正確なので、MySQL は行がある場合は行ごとに検索しません。 my_col 列に null 値がない場合、状況は前述と同じになります。つまり、count(my_col) は非常に高速になります。
where 句がある場合に count() を使用すると、基本的に where 句内で明らかなインデックス列を超えることはできません。複雑な where 句の場合は、カバーするインデックスのみが役に立ちます。
上記の提案に加えて、サマリー テーブルを使用して、テーブルの内容を常に最新の状態に維持したり、バッチを実行したりすることもできます。ジョブは定期的に最新のデータ情報を入力し続けます。後者を使用すると、バッチ ジョブの実行頻度に応じて、情報は正確ではなくなります。これは、アプリケーションの正確な情報の必要性と比較する必要があります。更新されたシステムのオーバーヘッドには、この 2 つのバランスが必要です。
4. サブクエリを最適化する
サブクエリが発生した場合、MySQL クエリ最適化エンジンが常に最も効果的であるとは限りません。これが、サブクエリが結合クエリに変換されることが多い理由です。もちろん、注意すべき点が 1 つあります。接続テーブル (2 番目のテーブル) の接続列にはインデックスが付けられます。MySQL は通常、2 番目のテーブルのクエリ サブセットに対して完全なテーブル スキャンを実行します。これはネストされたループ アルゴリズムの一部です。
5.UNIONを最適化する
複数の異なるデータベースにまたがる場合に UNION を使用することは、興味深い最適化方法です。UNION は、関連のない 2 つのテーブルからデータを返します。つまり、重複する行が存在せず、データの並べ替えも非常にリソースが必要になることがわかります。消費、特に大きなテーブルのソート。
UNION ALL を使用すると、プロセスを大幅に高速化できます。データに重複行が含まれないことがすでにわかっている場合、または重複行が表示されるかどうかを気にしない場合は、次の 2 つの場合に UNION ALL を使用する方が適しています。さらに、アプリケーション ロジックでいくつかのメソッドを使用して行の重複を避けることができます。これにより、UNION ALL と UNION によって返される結果は同じになりますが、UNION ALL は並べ替えられません。
[ビットネットワーク]からの原文: http://soft.chinabyte.com/database/254/11335754.shtml
関連読書
mysqlの最適化(mysqlで実行効率の低いSQL文をクエリする方法)
何千万ものmysqlデータベース内の同じ構造を持つ複数のテーブルに対して結合クエリを実行するにはどうすればよいですか?クエリ速度を向上させるために最適化または設定するにはどうすればよいですか?
mysqlデータベース内の数千万のデータのクエリ最適化とページングテスト
mysql学習体験
MySQL データベースを最適化する 8 つの方法