概要概要
最適化する理由
- システムスループットのボトルネックは、データベースのアクセス速度に現れることがよくあります
- アプリケーションが実行されると、データベースに含まれるデータが増え、それに応じて処理時間が遅くなります。
- データはディスクに保存され、読み取りと書き込みの速度をメモリと比較することはできません
最適化する方法
- データベースを設計する場合:データベースのテーブルとフィールドの設計、ストレージエンジン
- インデックスなど、MySQL自体が提供する機能を活用してください
- 水平方向の拡張:MySQLクラスター、負荷分散、読み取り/書き込み分離
- SQLステートメントの最適化(ほとんど効果なし)
1MySQLの2つの一般的なストレージエンジンであるMyISAMとInnoDBについての私の理解について話します
2つの比較と要約について:
カウント操作の違い:MyISAMキャッシュにはテーブルメタデータ(行数など)があるため、COUNT(*)を実行するときに、適切に構造化されたクエリのために多くのリソースを消費する必要はありません。InnoDBの場合、そのようなキャッシュはありません。
トランザクションとクラッシュ後の安全なリカバリをサポートするかどうか:MyISAMはパフォーマンスを重視し、各クエリはアトミックであり、その実行はInnoDBタイプよりも高速ですが、トランザクションのサポートは提供しません。ただし、InnoDBは、トランザクションサポートトランザクションや外部キーなどの高度なデータベース機能を提供します。トランザクション(コミット)、ロールバック(ロールバック)、およびクラッシュリカバリ機能(クラッシュリカバリ機能)を備えたトランザクションセーフ(ACID準拠)タイプのテーブル。
外部キーをサポートするかどうか:MyISAMはサポートしていませんが、InnoDBはサポートしています。
MyISAMは読み取り中心のテーブルに適していますが、InnoDBは書き込み中心のテーブルに適しています。データベース分離の場合、MyISAMがメインデータベースのストレージエンジンとして選択されることがよくあります。一般的に、トランザクションサポートが必要で、同時読み取りの頻度が高い場合(MyISAMのテーブルロックの粒度が大きすぎるため、テーブル書き込みの同時実行性が高い場合、待機するクエリが多くなります)、InnoDBそれは良い選択です。大量のデータがあり(MyISAMはディスク領域の使用量を削減するための圧縮機能をサポートしています)、トランザクションをサポートする必要がない場合は、MyISAMが最適です。
2データベースインデックスを理解していますか?
これが私が追加したコンテンツの一部です
インデックスによってクエリ速度が向上するのはなぜですか?
MySQLの基本的なストレージ構造から始めましょう
MySQLの基本的なストレージ構造はページです(レコードはページに保存されます)。
各データページは、二重にリンクされたリストを形成できます
各データページのレコードは、単一リンクリストを形成できます
各データページは、そこに保存されているレコードのページディレクトリを生成します。プライマリキーを使用してレコードを検索する場合、ページディレクトリの二分法を使用して、対応するスロットをすばやく見つけ、スロットの対応するグループをトラバースできます。指定されたレコードをすばやく見つけるには
検索条件として他の列(非プライマリキー)を使用します。単一リンクリストの各レコードは、最小のレコードから順番にトラバースすることしかできません。
したがって、最適化せずにindexname = 'xxx'のようなSQLステートメントであるselect * from userと書くと、デフォルトでこれが実行されます。
レコードが配置されているページを見つけます。ページを見つけるには、二重にリンクされたリストをトラバースする必要があります
現在のページから対応するレコードを検索します。これはプライマリキークエリに基づいていないため、現在のページの単一リンクリストのみをトラバースできます。
明らかに、データ量が多い場合、この検索は非常に遅くなります。今回の複雑さはO(n)です。
インデックスを使用した後
クエリを高速化するためにインデックスは何ができますか?実際、無秩序なデータを(比較的)順序に変換します。
ID 8のレコードを見つけるための簡単な手順:
明らかに:インデックスを作成せずに、二重にリンクされたリストをトラバースして対応するページを見つける必要があります。これで、「ディレクトリ」 から対応するページを すばやく見つけることができます。(バイナリ検索、時間の複雑さは約O(logn)です)実際、基礎となる構造はB +ツリーです。ツリーの実装として、B +ツリーは対応するレコードをすばやく見つけることができます。
次のコンテンツは、「Javaエンジニアの実践の方法」から構成されています。
左端のプレフィックスの原則
MySQLのインデックスは、特定の順序で複数の列を参照できます。この種のインデックスは、ジョイントインデックスと呼ばれます。たとえば、Userテーブルとジョイントインデックスの名前と都市は(name、city)oであり、左端のプレフィックスの原則は、クエリ条件がインデックスの左側の1つまたは複数の列と完全に一致する場合、この列を使用できることを示しています。に。次のように:
select * from user where name = xx and city = xx; //インデックスにヒットできます
select * from user where name = xx; //インデックスにヒットできます
select * from user where city = xx; //インデックスにヒットできません
ここで、クエリで両方の条件が使用されているが、順序が異なる場合(city = xxとname = xxなど)、現在のクエリエンジンは、ジョイントインデックスの順序に一致するように自動的に最適化されるため、ヒットできることに注意してください。インデックス付き。
左端のプレフィックスの原則により、ジョイントインデックスを作成する場合、インデックスフィールドの順序は、重複排除後のフィールド値の数を考慮し、より多くを前面に配置する必要があります。
ORDERBY句もこのルールに従います。
冗長なインデックスを避けるように注意してください
冗長インデックスとは、インデックスと同じ機能を指します。ヒットできる場合は必ずヒットします。それが冗長インデックスです。2つのインデックス(name、city)と(name)は冗長インデックスです。後者にヒットできるクエリは、ほとんどの場合、前者をヒットできる場合は、新しいインデックスを作成するのではなく、既存のインデックスを拡張してみてください。
MySQLS.7バージョン以降は、sysライブラリのscheme_r dundant_indexesテーブルにクエリを実行して、冗長インデックスを確認できます。
Mysqlはどのようにテーブルフィールドにインデックスを追加しますか???
1. PRIMARY KEY(プライマリキーインデックス)を追加します
ALTER TABLE `table_name` ADD PRIMARY KEY(` column`)
2. UNIQUE(一意のインデックス)を追加します
ALTER TABLE `table_name` ADD UNIQUE(` column`)
3. INDEX(通常のインデックス)を追加します
ALTER TABLE `table_name` ADD INDEX index_name(` column`)
4. FULLTEXT(フルテキストインデックス)を追加します
ALTER TABLE `table_name` ADD FULLTEXT(` column`)
5.複数列のインデックスを追加します
ALTER TABLE `table_name` ADD INDEX index_name(` column1`、 `column2`、` column3`)
3大きなテーブルの一般的な最適化方法について話します
4 1つのMySQLテーブルのレコード数が多すぎると、データベースのCRUDパフォーマンスが大幅に低下します。一般的な最適化対策は次のとおりです。
1つのMySQLテーブルのレコード数が多すぎると、データベースのCRUDパフォーマンスが大幅に低下します。一般的な最適化対策は次のとおりです。
1.データの範囲を制限する: データの範囲を制限する条件のないクエリステートメントは必ず禁止してください。例:ユーザーが注文履歴を照会している場合、1か月以内にそれを制御できます。;
2.読み取り/書き込み分離: 従来のデータベース分割スキーム。メインライブラリが書き込みを担当し、スレーブライブラリが読み取りを担当します。
3.垂直パーティション:データベース内のデータテーブルの相関に従って分割します。 たとえば、ユーザーテーブルにユーザーのログイン情報とユーザーの基本情報の両方が含まれている場合、ユーザーテーブルを2つの別々のテーブルに分割したり、サブデータベース用に別々のデータベースに配置したりすることもできます。簡単に言うと、垂直分割とは、データテーブルの列を分割し、多くの列を持つテーブルを複数のテーブルに分割することです。 下の図に示すように、誰もが理解しやすいはずです。
垂直分割の利点: 行データを小さくし、クエリ中に読み取られるブロックの数を減らし、I / Oの数を減らすことができます。さらに、垂直分割により、テーブルの構造が簡素化され、保守が容易になります。
垂直分割のデメリット: プライマリキーが冗長になり、冗長な列を管理する必要があり、結合操作が発生します。これは、アプリケーション層で結合することで解決できます。さらに、垂直分割はトランザクションをより複雑にします。
4.水平パーティション:データテーブル構造を変更せずに、特定の戦略でデータフラグメントを保存します。このようにして、各データは異なるテーブルまたはライブラリに分散され、配布の目的を達成します。水平分割は、非常に大量のデータをサポートできます。水平分割とは、データテーブルの行を分割することです。テーブルの行数が200万行を超えると、速度が低下します。このとき、1つのテーブルのデータを複数のテーブルに分割して保存できます。
例:ユーザー情報テーブルを複数のユーザー情報テーブルに分割して、大きすぎる単一のテーブルによるパフォーマンスへの影響を回避できます。
水平分割は、非常に大量のデータをサポートできます。注意すべき点の1つは、テーブルの分割は1つのテーブルのデータが大きすぎるという問題を解決するだけですが、テーブルのデータは同じマシン上にあるため、MySQLの同時実行性を向上させる意味がないため、データベースを分割するのに水平分割が最適です。 。水平分割は非常に大量のデータストレージをサポートでき、アプリケーション側の変換はほとんどありませんが、フラグメンテーショントランザクションの解決が難しく、国境を越えた結合のパフォーマンスが低く、ロジックが複雑です。
「ThePracticeof Java Engineers」の著者は、分割によってロジック、展開、運用、保守がさまざまに複雑に なり、適切な最適化の条件下で一般的なデータテーブルが1,000万未満をサポートできるため、データをできるだけ断片化しないことを推奨しています。データ量は大きな問題ではありません。本当にフラグメント化する場合は、クライアントフラグメンテーションアーキテクチャを選択してみてください。これにより、ネットワークI / Oとミドルウェアを1回削減できます。
データベースの断片化の2つの一般的なシナリオは次のとおりです。
クライアントプロキシ:フラグメンテーションロジックはアプリケーション側にあり、jarパッケージにカプセル化され、JDBCレイヤーを変更またはカプセル化することによって実装されます。 DangdangのSharding-JDBC とAliのTDDLは、一般的に使用される2つの実装です。
ミドルウェアエージェント:アプリケーションとデータの間にエージェントレイヤーが追加されます。断片化ロジックは、ミドルウェアサービスで一律に維持されます。 私たちは今、話している Mycat など、360のアトラス、網易のDDB、このアーキテクチャのすべての実装されています。
最後に書く
スペース上の理由から、上記にリストされているのはほんの一部です。私はそれらをpdfファイルにコンパイルし、必要な人に無料で共有しています。
ここにいる全員のために、「ゴールデンナインとシルバーテン」のジョブホッピングシーズンのJavaアーキテクト学習ビデオとJavaバックエンドインタビュー情報をまとめました。
Javaアーキテクト学習教材:
- 手書きのミバティス
- Aliのインタビューで尋ねなければならないJVMをどのように学ぶ必要がありますか?
- 同時プログラミングの基本原則-手書きのJDKロック
- 春のトランザクションソースコード分析
- 高い同時実行パフォーマンスは毎秒スタントします
- などなど
Javaインタビューの質問:
- Linuxインタビューのトピックと回答
- JVMインタビューのトピックと回答
- Javaの基本的なインタビューの質問
- カフカインタビューのトピックと回答
- ダボのインタビューと回答
- ネティインタビューのトピックと回答
- ActiveMQメッセージミドルウェアインタビュートピック
- メッセージミドルウェアインタビューのトピックと回答
- データベースインタビューのトピックと回答
- マイクロサービスインタビューのトピックと回答
- インタビューのための楽観的および悲観的なロック
- オープンソースフレームワークインタビューのトピックと回答
- デザインパターンインタビューのトピックと回答
- マルチスレッドインタビューのトピックと回答
- 動物園の飼育係のインタビューのトピックと回答
- 同時プログラミングインタビューのトピックと回答
- などなど
「無私の共有」の精神で、この記事に要約されているコース概要(PDFバージョン)を必要とする友人、Javaアーキテクトの学習ビデオ、およびJavaインタビューの質問