私たちは、パフォーマンス・テストを行っていることは、あなたがシステムのボトルネックを測定したい場所を最後に我々のシステムのパフォーマンスに影響を与える場合は、問題を発見し、それを解決するためである、である、ことを目指しています。もちろん、システムがたくさんで一緒に、アプリケーション、データベース、サーバ、ミドルウェアなどを一緒に多くのものの組み合わせで構成されています。我々は任意のリンクに問題があるかもしれないこれらのものの上にテストしたその時、我々のシステムのパフォーマンスに影響を与える可能性があります。このブログは私達がいつ、どこで、どのような最適化する必要が監視されるべきである何をされている次のMySQLデータベースのパフォーマンステストについて、主です。
何の事は、MySQLのパフォーマンスに影響を与えるのだろうか?
1.ハードウェア
2.システム構成
3.データベースのテーブル構造
4.SQLとインデックス
ハードウェア
これは、コンピュータの構成が高い場合、白は、1台のコンピュータのみであるサーバは、強力なCPU処理能力、大容量メモリ、ハードディスクはSSDで、データベース・サーバのハードウェア構成を指し、それは確かに良いパフォーマンスです。もちろん、これはまた、お金の事を過ごすのに最高のコストの方法です。
システム構成
当社のサーバーのオペレーティングシステムの設定を参照して、いくつかのオペレーティングシステムの構成があるのMySQLのパフォーマンスに影響を与えることができ、Linuxサーバー今ではほとんどが使用されているシステムを設定すると、すべて上記のLinuxは内部のファイルベースのデータMySQLのテーブルです、そのデータとは、ファイルがディスク上に存在しています。
Linuxシステムでは、システムの構成を有しており、開いているファイルの数である1024年オープンファイルの最大となる、デフォルトは1024で複数のテーブルがデータベースにあること、大規模な同時の場合、1024年には、取得するために、十分ではありませんデータは、ファイルを開くために持っているが、1024年までに開いているファイルの数は、少ない一部のデータ収集につながる、あなたが別のファイルを待つ必要が後に開くように、閉じられています。それはで、システムの構成を変更する必要があります/etc/security/limits.confをインサイドオープンファイルの最大数を変更することができます。
いくつかのMySQLの設定パラメータは、MySQLのパフォーマンスに影響を与える可能性があります。
スリープタイムアウト
接続mysqlの数は、コードがひどく、プログラム記述されている場合、事前に設定されているいくつかのデータベース操作の下でデータベースを閉じていなかったが、このリンクはリリースされないことを、常にこの同時大のようなリンクを占有し、それをこれは、データベース接続が十分ではない原因は、データベースを接続することはできません。MySQLのデフォルトの8時間は、データベースは自動的にクローズリンクを操作していないので、スリープタイムアウトは、MySQLのパフォーマンスに影響します。
別の表スペースを設定
リード/ライト処理の設定数
mysql5.5を読んだ後、書き込みプロセスの数は設定可能です。読み取りおよび書き込みプロセスのデフォルト数は4です。
もちろん、我々はすべての多くの手が仕事の事を作ることを知っています。プロセスは、これら2つの値の設定およびCPUコアのビジネスロジックの数に応じて、特定の構成多くの人が仕事以上です。
CPUコアが32である場合に実行されている32個のプロセスが存在するが、その後、あなたはこれらの2つの値は、大規模な転送することが可能となります。
システムは、コンテンツサイトの種類と言われている場合は、操作のほとんどは、あなたがプロセスの数が大きく設定されて読み取ることができ、読み込まれ、番号を書き込むプロセスが小さくなるように設定しました。
見つけて、それを修正する方法[mysqldを]ノードでは、MySQLの設定ファイルをに次のパラメータを追加します
キャッシュの設定
私たちが最初に明確にキャッシュ構成を理解する必要がありますと言って前に、処理タスクの時にコンピュータが扱う、とする方法であるデータを取得するために中に入るために、メモリ、CPUのメモリ内に置く、その後、処理された後、開始するには、ディスク上のデータを読み込み、。
CPUが処理された後に書面でちょうど反対は、メモリへのデータは内部の、そしてメモリにディスクを入れました。
上記からそれは、我々はメモリから直接データならば、その後、内部を取り、その速度がはるかに高速であり、我々は下のグラフを見て、データ1Mを読んで、そしてどのくらいのメモリがディスクからよりも速く、ことがわかります。
以上のことから、我々はN倍速いデータよりもメモリから読み出され、この図は、内部のディスクからデータを取り出すことがわかります。
それmysqlのは、するデータへのアクセスの時間ならば、MySQLは多くの高速化にはなりませんメモリから直接データを取り、内部のキャッシュメモリにいくつかのデータを置きます。
最初のmysqlの実装とATのは、MySQLのキャッシュの前に言ってみましょうクエリをそれらが行われたとき。
上記のグラフから、我々は見つける、mysqlのメモリをチェックするには、2つの場所があります。内部メモリは、私たちが望むデータを検索する場合は、ディスクのデータを照会するために行くしないでください。したがって、これら2つのキャッシュが何であるか、どのようにそれを設定します。
qcache設定
キャッシュは、SELECT文とクエリの結果、クエリキャッシュヒットを完了し、MySQLはすぐに、結果を返す構文解析、最適化、実装フェーズをスキップします。
テーブルの変更は、この表に関連するすべてのキャッシュされたクエリとすべてが失敗した場合、クエリキャッシュシステムは、各テーブルを追跡します。
クエリキャッシュをチェックすると、MySQLは任意のSQL処理ではありません、それはクライアントから送信された正確なクエリを使用して、限り文字ケースを(選択)、または少し異なるコメント、クエリキャッシュは、別のクエリであると考えられ。
キャッシュされません(そのようになりました()は、CURRENT_DATEは()のような)未定義の関数を含む任意のクエリ。
MySQLのクエリキャッシュは、パフォーマンスを向上させることができますが、使用には、注意を必要とするいくつかの問題がありますとき:
読み取りのためのオープンクエリキャッシュとすべての追加のオーバーヘッドを追加書き込み。あなたがキャッシュをチェックする必要があり、クエリの開始前に、読書のために、書き込みのため、書き込み後にキャッシュを更新する必要があります。
通常、これらのコストは比較的小さいので、クエリキャッシュは、まだ一般的に良いです。しかし、また、事業特性に応じたクエリキャッシュを有効にするかどうかを量ります。
それを構成する方法、見つけるために[mysqldを]ノードの下、MySQLの設定ファイルをすることができ、次のパラメータを追加します
innodb_buffer_pool設定
MySQLのストレージエンジンのmysqlは、キャッシュ構成がinnodb_buffer_poolの構成である、のInnoDB mysqlは、デフォルトのストレージエンジンでもあった場合にそれがはっきり最後に保存されたデータの保存方法です。
どのようにそれは商品の倉庫内に配置されます。
そのメモリから最初のクエリは、メモリが存在する場合、クエリ応答時間を改善するために直接戻るときにバッファプールキャッシュはInnoDBストレージエンジン、クエリデータとのプールです。
qcache違いInnoDBのバッファプールとは、次のとおりです。qcacche SQLステートメント・キャッシュは、結果に対応して設定され、バッファプールは、テーブル内のデータをキャッシュしています。バッファー・プール・サーバーは、一般的に、物理メモリの70%に設定されています。
、それを設定するには見つけるために、どのようにMySQLの設定ファイルを、[mysqldを]ノード内に次のパラメータを追加します
MySQLのアーキテクチャの最適化
別々の読み取りと書き込み
マルチ書か
データベースのテーブル構造の最適化
もちろん、システムの設計にテーブル構造は、とき通常、設計者や開発者の束が良いのテーブル構造設計を入れている、必要が注意を払うために設計テーブル構造で、我々は我々が知らないアーキテクチャのレベルに達していなかった何か、何か。
MySQLのインデックスチューニング
それは同じで、インデックス、辞書やディレクトリは何ですか。そこディレクトリに移動し、我々は、高速にデータを確認してください。
後列where句に現れるインデックス列を構築するための最も適しました。
インデックスのみ最良の効果、それがユニークなので。
最も左のプレフィックスを使用。
インデックスがない方が良いです。
インデックスのMySQLの4種類があります。
1、一般的な指標
最も一般的なインデックスは、すべての列を追加することができます
作成し たインデックス index_nameのを上 table_nameの(COL)。
2、主キー索引
ときにテーブルの構成に加えて主キー
3、コンビネーションインデックス
作成し たインデックス index_nameのを上 TABLE_NAME(COL、COL2);
4、一意のインデックス
CREATE UNIQUE INDEXのINDEX_NAMEを ON TABLE_NAME(COLUMN_NAME)。
重複除外、冗長性指数
各の発展のレベルが異なるため、必然的にいくつかの問題がインデックスを繰り返しがあるでしょう。どのように我々はまだインデックスにいくつかの冗長性を持っていることがわかります。
Percona-ツールキットは、それは、このツールは、我々はインデックステーブルの冗長性の内部で持っているものを見つけるのを助けることができるPT-複製キー・チェッカーを含み、インデックスステートメントを変更できます、このツールを使用する必要があります。
PT -複製- キー-チェッカー- -uroot - PXXX - DXX#- Uは、ユーザを指し- Pは、パスワードである- Dデータベース
私たちは重複したインデックスを見つける助けには、単にインデックスが繰り返されていないが、インデックスを使用する必要はありませんが、実際にpercona-ツールキット、それを行う方法を、クエリでこれをそれを使用しなかったいくつかがありますツールPT-インデックスの使用中のツールがあり、それは我々がそれらの無用のインデックスを見つけるのに役立つ、スロークエリログを読むことができます。
pt-index-usage /opt/data/slow.log #后面是慢查询日志
慢查询日志
什么是慢查询日志呢,它这个就是个神器了,对咱们测试特别有帮助,它会记录执行时间长的sql语句,这样咱们找问题的时候就比较方便了。
SETグローバルslow_query_log = ON ;#スロークエリログ開く SETグローバルlong_query_timeを=を1。;#設定したレコードどのくらいのSQLクエリよりも SETグローバルslow_query_log_file = ' /tmp/slow_query.log ' ;セット#mysqlのスロークエリログ・パス、どの書き込みアクセス持っている必要があります セットを、(株)無料log_queries_not_using_indexes参加= ON ;#設定がインデックスSQL記録し使用していない のSHOW VARIABLES LIKE 「%遅い%を」 ;#表示スロークエリの構成
MySQLのログレコードは内部の、私たちはあまり明確に見え、我々はPT-クエリダイジェスト当社のスロークエリログを解決するには、このツールを使用し、それが私たちの統計を実行する助けた何回すべての時間や特定のSQL SQLを実行しますアウト。
ここでの用法であるPT-クエリはダイジェスト
白金-クエリ-ダイジェスト- フィルタ= '$イベント- >指紋{M} =〜/ ^選択/私は' #をslow.logスロークエリのSELECT文表示 白金-クエリ-ダイジェスト - slow.log = 12H以来営業を#最後の12時間の 白金-クエリ-ダイジェスト - 「2017年12月2日午前10時00分00秒」--filter =「$イベント--until「2017年12月1日9時30分00秒」以来営業します- > {指紋} =〜メートル/ ^選択 / I「slow.log# 指定された期間
あなたが長い時間のSQLを実装されていないリアルタイムを取得したい場合は、次のSQL文を使用
選択 ID、 ` ユーザー ` `host`、DB、コマンド、` time`、状態情報から information_schema.PROCESSLIST TIME > = 60。
説明します
スロークエリログにより我々は、その後どのようにこのSQL問題を見てどのように、私たちは限り、あなたはに説明してSQL文の前に実行するよう、使用することを説明しなければならないこと、疑問にSQL文を見つけることができます
すべての<インデックス<範囲<refの<でeq_ref <constの、最高に最悪のシステムのSQL実行型の列
その際、SQLの最適化に注意してください。
インデックス付きの列を使用してクエリは、インデックスを使用して列をソート
通常、全表スキャンになります*を選択し、*を選択しないでください
サブクエリを避けてください。この問題は、年間存在しているが、MySQLのサブクエリ実行プランは、大きな問題があったが、今のところすべてがリリースされている安定版はあまり改善されていない、流行しています。関係者はまた、早期に問題を認め、そしてコミットメントは、できるだけ早く解決するために、しかし、少なくとも今のところ、我々はこの問題にどのバージョンよりよい解決策を見ていないが。
事
銀行の例としては、お金を節約します。
ロック
テーブルレベルのロック、行レベルのロック。
information_schema.INNODB_TRX \ G SELECT * FROM
MySQLのパフォーマンステストツール
mysqlslapはMySQLのでは、パフォーマンステストツールが付属しています。これは、並行処理の多様性をシミュレートし、そのSQLを使用して、どのくらいのデータ、長期の生成、レポートを作成することができます。
共通のオプション
- 同時の同時実行数が、複数のコンマで分離されていてもよい - エンジンエンジンが試験される、複数存在することができ、そのようなのMyISAM = --engines、InnoDBのような区切り文字で区切ら - システム自体に自動生成し、SQL生成されたSQLスクリプトをテストする - 自動生成SQLツー読み取りまたは書き込み、またはその両方の組み合わせ(読み取り、書き込み、更新、混合)のタイプの負荷テスト - あなたが実行したい総オブクエリー回数を数クエリ。各顧客は、クエリ/同時計算の合計数で実行できるクエリの数 - デバッグ情報の余分なCPUからの出力と、関連情報の記憶 - テストテーブルを作成するには、タイプint型のフィールド番号-INT-colsの数 - 数-char-チャット型のフィールドCOLSの数は、テストテーブルを作成する - スキーマ・テスト・データベースを作成する - 独自のSQLスクリプトの実行テストをクエリ - のみ、印刷をあなたはどのようなSQL文を参照して印刷したい場合は、このオプションを使用することができます
の使用の例を次に示します
100同時動作1000ライトと自動的にSQL、int型のフィールド2、char型10、生成された読み出し動作 のmysqlslapを-。H127 0.0。1 - -uroot - p123456 - 並行= 100 --auto- --auto-生成-SQL SQL-生成 -load型=混合--engine = InnoDBは--auto-生成-SQL-アドイン自動インクリメント--number-INT-COLS = 2 --number-チャーCOLS = 10 クエリ= -of ---番号10 100同時動作5000は、besttestこのデータベースSQLで行わ のmysqlslap - H127。0.0。1。 - -uroot - p123456 - 並行処理--query = 100 = 'SELECT * STUから;' -作成-スキーマ= besttest --engine = InnoDBの --number・オブ・クエリ= 5000 --debug-情報 100同時動作5000、指定されたファイルのSQL実行するには、このデータベースbesttest のmysqlslapを-。H127 0.0。1 - -uroot - p123456 - 並行--query = 100 = / TMP / besttest.sql -create-スキーマ= besttest -エンジン= InnoDBの--number・オブ・クエリ = 5000 --debug-情報