ホームページ  >  記事  >  バックエンド開発  >  PHP mysqlの最適化

PHP mysqlの最適化

不言
不言オリジナル
2018-04-16 11:31:261839ブラウズ

この記事の内容は、特定の参考値を持つ PHP mysql の最適化に関するものです。必要な友達は参考にしてください

MySQL のヒント

    1。 SQL ステートメント内のキーワードは
  • 大文字 で記述するのが最適です。第 1 に、SQL ステートメントが実行されるときに、MySQL が大文字に変換して数値を増やすことができます。クエリの効率 (小さいとはいえ)。

  • 2. データベース内のデータ行を追加または削除すると、データ ID が大きすぎます。
  • ALTER TABLE tablename AUTO_INCREMENT=N, を使用して、N から始まる自動インクリメント ID を作成します。

  • 3.
  • ZEROFILL 属性を int 型に追加すると、データに 0 が自動的に追加されます

  • 4. 大量のデータをインポートする場合は、最初にインデックスを削除し、そうしないと、mysql はインデックスの更新に多くの時間を費やします。
  • 5. データベースを作成して SQL ステートメントを記述する場合、IDE で .sql という接尾辞が付いたファイルを作成できるため、IDE は SQL 構文を認識し、記述が容易になります。さらに重要なのは、データベースが失われた場合でも、このファイルを見つけて、現在のディレクトリで
  • /path/mysql -uusername -ppassword データベース名 < filename.sql を使用して、ファイル全体の SQL ステートメントを実行できることです。 -u と -p の後にはスペースを含まないユーザー名とパスワードが続きます)。



データベース設計の最適化1. データベース設計は 3 番目のパラダイムに準拠しており、クエリの便宜のためにある程度のデータの冗長性を持たせることができます。 2. データ型の優先順位を int > date, time > char > varchar > blob に置き換えることを検討できます。 ip2long() 関数を使用してストレージをタイプします。
3. char(n) 型の場合、データが完成したときに n の値をできるだけ小さく保つようにします。
4. テーブルを作成する場合、partition コマンドを使用して 1 つの

テーブル をパーティション化すると、クエリ効率が大幅に向上します。その中で、RANGE、LIST、HASH、KEY パーティション タイプが最もよく使用されます。パーティショニング方法は、 CREATE TABLE tablename { }ENGINE innodb/myisam CHARSET utf8 //データベースエンジンとエンコーディングを選択
PARTITION BY RANGE/LIST(column),//範囲と事前定義リストでパーティション分割
PARTITION partname VALUES LESS THAN / IN(n),// パーティションに名前を付け、パーティションのスコープを詳細に制限します
5. データベース エンジンを選択するときは、innodb と myisam の違いに注意してください

ストレージ構造: MyISAM はディスク上の 3 つのファイルに保存されます。 InnoDB のすべてのテーブルは同じデータ ファイル (通常は 2 GB) に保存されます。 トランザクション サポート: MyISAM はトランザクション サポートを提供しません。 InnoDB はトランザクション サポートを提供します。 テーブル ロックの違い: MyISAM はテーブル レベルのロックのみをサポートします。 InnoDB はトランザクションと行レベルのロックをサポートします。 フルテキスト インデックス: MyISAM は FULLTEXT タイプのフルテキスト インデックスをサポートしています (中国語には適用されないため、Sphinx フルテキスト インデックス エンジンを使用する必要があります)。 InnoDB はそれをサポートしていません。 テーブル内の特定の行数: MyISAM はテーブル内の総行数を保存し、count(*) のクエリは非常に高速です。 InnoDB はテーブル内の行の合計数を保存しないため、再計算する必要があります。
外部キー: MyISAM はサポートしていません。 InnoDB は





インデックスの最適化

1 をサポートしています。Innodb はインデックスを保存するときに主キーが必要です。指定されていない場合、エンジンは自動的に非表示の主キーを生成し、 を生成します。 プライマリインデックス 、プライマリキーの物理アドレスはインデックスに保存され、データはプライマリキーによって保存されます。インデックスを使用するたびに、まずプライマリインデックスを見つけてから、その下のデータを見つける必要があります。プライマリインデックス。
利点は、主キーによる検索が非常に高速であることです。欠点は、最初にセカンダリ インデックスを通じてプライマリ インデックスを見つける必要があるため、セカンダリ インデックスが遅くなるということです (セカンダリ インデックスはプライマリ インデックスの場所です)。 .)、プライマリ インデックスを通じてデータを検索します。また、主キーが不規則だと、新しい値を挿入する際に多くのデータブロックを移動する必要があり、効率に影響するため、主キーには定期的に増加するint型を使用するようにしてください。また、データは主キーの直後に配置されるため、データ内に特に大量のデータを含むカラム (テキスト/ブロブ) がある場合、InnoDB はクエリ中に多くのデータ ブロックをスキップし、これも速度低下の原因となります。

2. myisam のインデックスの各インデックスは同じで、ディスク上の各行のアドレスを指します。これらはすべて軽量のポインター データです。欠点は、各インデックスが主キーを介して確立されないことと、クエリがクラスター化インデックスで主キーを検索するほど高速ではないことです。ただし、アドレスが保存されているため、新しい値を挿入すると比較の側面が移動して変更されます。
3. 複数条件のクエリを実行する場合、複数の条件のインデックスを個別に作成する場合、SQL クエリを実行する場合、MySQL は使用するインデックスのみを選択します。そのため、複数条件のクエリが必要な場合は、結合インデックスを使用する必要があります。データの冗長性が生じる場合でも、確立されます。
結合インデックスのBTREE構築方法:最初の条件のインデックスを作成し、最初のインデックスのBTREE領域に2番目の条件のインデックスを作成する、というように、インデックスを使用する場合はとなります。最初の条件は必要ありません。 2 番目の条件はジョイントインデックスを使用しません。インデックスを使用する場合、条件は順序どおりに使用し、順番に使用する必要があります。
4. インデックスの長さもクエリに大きな影響を及ぼします。テストにはクエリ列
SELECT COUNT(DISTINCT LEFT(column)) / COUNT(*) を使用して構築する必要があります。列にインデックスを付ける さまざまな長さを選択する場合、インデックスの範囲はどれくらいですか? インデックスを作成するには、飽和に近い n 個の長さを選択します。 ALTER TABLE tablename ADD INDEX (column(n));特定の列の最初の n 文字。最初の n 文字が同じであれば、文字列を反転して保存し、インデックスを作成することもできます。
5. 頻繁な変更によるインデックスの断片化を維持する方法: ALTER TABLE tablename ENGINE oldengine; つまり、テーブル ストレージ エンジンを再度適用して、自動メンテナンスを有効にすることもできます。



データクエリの最適化 クエリがある場合は、データベースレベルでのデータ操作を実行しないようにし、代わりに PHP スクリプトに戻って操作します。データを圧縮してデータベースへの負担を軽減します。 データベースのパフォーマンスの問題が発見されたら、時間内に解決する必要があります。一般に、

Slow Queryログを使用して「遅い」クエリを記録し、EXPLAINを使用してクエリとインデックスの使用状況を分析し、を使用します。 PROFILE は、ステートメント実行中の特定のリソース消費を分析します。
スロークエリログ: 1. my.ini または my.cnf の [mysqld] に slow_query_log_file=/path を追加します // ログ保存パスを設定します
long_query_time=n // if ステートメントの実行時間を設定しますn秒に達すると記録されます
2. 次に、MySQLでSET throw_query_log='ON'を設定し、スロークエリを有効にします。
3. ログを記録した後、/bin/ ディレクトリ内の mysqldumpslow ファイル名を使用してログを表示します。一般的に使用されるパラメータは次のとおりです。
-g パターンは正規表現を使用します
-t n は最初の n 個のデータを返します
-s c/ t/l /r レコード数/時刻/クエリ時刻/返されたレコード数でソート

EXPLAIN文使用方法は、実行するクエリ文の前にEXPLAINを追加EXPLAIN SELECT * FROM user ;
結果は以下の通りです。 結果:

以下は各項目の説明です: id はクエリ文の ID です。複数のクエリが実行される場合、クエリの実行順序は意味がありません。
select-type は、simple/primary/union などの複数のクエリに対応する、実行されるクエリ ステートメントのタイプです。
tabel クエリ ステートメントによってクエリされたデータ テーブル


type 取得されるデータの一般的な型効率は、高いものから低いものまで、null>const>eq_ref>ref>range>index>allpossible-keys:indexes です。使用される可能性があるもの

key 使用されるインデックス key_len インデックスの長さ ref インデックスとともにテーブルから選択するために使用される列。


行数 データを見つけるためにスキャンされるおおよその行数を見つけます。すると、インデックスの品質を確認できます
追加 一般的なものは、データのクエリ後にファイルソートを使用してファイルを並べ替えます。これは遅く、インデックスを最適化する必要があります where を使用すると、データの行全体が読み取られ、フィルター処理が実行されて、where 条件を満たすかどうかが判断されます。インデックス インデックス カバレッジを使用すると、ターゲット データがすでにトラクションに格納されており、インデックスが作成されます。直接読み取られるため、非常に高速です。

PROFILE
PROFILEのオープンステータスを確認するには、SELECT @@frofilingを使用します。
有効になっていない場合は、SET profiling=1 を使用して有効にします。
これをオンにすると、MySQL はクエリ ステートメントの実行時にプロファイル情報を自動的に記録します。
すべての SQL 情報を表示するには、表示プロファイルを適用します。結果は、クエリ ID、時間、使用された SQL ステートメントの Query_ID 継続時間クエリの 3 列の結果です。
SHOW PFROFILE [
type[,type]][FOR QUREYQuery_ID][Limit rwo_count [OFFSET offset]]type を使用できます。一般的なものには、ALL (すべて) BLOCK IO (ディスプレイ IO 関連) が含まれますオーバーヘッド) CPU (CPU オーバーヘッド) MEMORY (メモリ オーバーヘッド) など


大規模ストレージの最適化
データベースのマスター/スレーブ レプリケーションと読み書き分離
1 マスターは変更を記録します。マスターサーバーのデータを複製するという目的を達成するために、マスターのバイナリがリレーログにコピーされ、データが独自のデータに戻されます。

マスター/スレーブ レプリケーションは、データベースの負荷分散、データベースのバックアップ、読み取り/書き込みの分離、その他の機能に使用できます。

2.マスターサーバーmasterを設定します
my.ini/my.confを変更します
[mysqld]
log-bin=mysql-bin //バイナリログを有効化します
server-id=102 //サーバーの一意のIDを設定します
3.スレーブサーバースレーブ
log-bin=mysql-bin //バイナリログを有効にする
server-id=226 //一意のサーバーID
4.マスターサーバー上でスレーブサーバーを認可します
GRANT REPLICATION SLAVE ON *.* to 'slavename' @'IP ' は 'root' によって識別されます
5.
を使用して、マスターを
に変更します。マスターからコピーされました。
設定を変更するたびにサーバーを再起動することを忘れないでください。その後、マスターサーバーとスレーブサーバーで show master/slave status を使用してマスター/スレーブのステータスを表示できます。
データベースでの読み取りと書き込みの分離を実現するには、mysql_proxy、atlas などの MySQL ミドルウェアに依存します。これらのミドルウェアをマスターサーバーとスレーブサーバーで読み取りと書き込みを分離するように構成することで、スレーブサーバーが読み取りを担当するようになり、マスターサーバーの負担が軽減されます。



データベースの共有


データベース内のデータテーブルのデータ量が非常に大きい場合、インデックス作成やキャッシュなど、データベースをシャーディングすることには大きな負担がかかります。クエリの負荷を軽減するために、複数のデータベース サーバーまたは複数のテーブル ストレージで使用されます。 方法には、垂直セグメンテーション、水平セグメンテーション、複合セグメンテーションが含まれます。
垂直セグメンテーション

: データテーブルが多数ある場合、データベース内で密接に関連するテーブル (同じモジュール、頻繁に接続およびクエリされるテーブルなど) を分割し、異なるマスター/スレーブサーバーに配置します。 水平セグメンテーション
: テーブルの数が少なく、テーブル内のデータ量が非常に多い場合、クエリを高速化するために、ハッシュやその他のアルゴリズムを使用してデータテーブルをいくつかに分割し、クエリを高速化するために、サーバー上でそれらを別々に配置します。水平シャーディングとデータテーブルパーティショニングの違いは、ストレージメディアの違いにあります。 結合分割
: 多くの場合、データ テーブルとテーブル内のデータ量が非常に大きいため、結合分割が必要になります。つまり、垂直方向と水平方向のテーブル分割が同時に実行されます。データベースは分散マトリックスに分割されて保存されます。 これらのデータベース最適化手法はそれぞれ、記事を書くために使用できます。これらの手法を理解して覚えておくと、必要に応じて目的を持った選択と最適化を行うことができ、データベースの効率を高めることができます。 関連する推奨事項:

PHP最適化セッションの使用法

PHP学習ルートとPHP最適化に関する10のヒント

以上がPHP mysqlの最適化の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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