PHP mysqlの最適化

Apr 16, 2018 am 11:31 AM
mysql php 最適化

この記事の内容は、特定の参考値を持つ 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 までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Navicatプレミアムの作成方法 Navicatプレミアムの作成方法 Apr 09, 2025 am 07:09 AM

NAVICATプレミアムを使用してデータベースを作成します。データベースサーバーに接続し、接続パラメーターを入力します。サーバーを右クリックして、[データベースの作成]を選択します。新しいデータベースの名前と指定された文字セットと照合を入力します。新しいデータベースに接続し、オブジェクトブラウザにテーブルを作成します。テーブルを右クリックして、データを挿入してデータを挿入します。

MySQL:簡単な学習のためのシンプルな概念 MySQL:簡単な学習のためのシンプルな概念 Apr 10, 2025 am 09:29 AM

MySQLは、オープンソースのリレーショナルデータベース管理システムです。 1)データベースとテーブルの作成:createdatabaseおよびcreateTableコマンドを使用します。 2)基本操作:挿入、更新、削除、選択。 3)高度な操作:参加、サブクエリ、トランザクション処理。 4)デバッグスキル:構文、データ型、およびアクセス許可を確認します。 5)最適化の提案:インデックスを使用し、選択*を避け、トランザクションを使用します。

PHPの未来:適応と革新 PHPの未来:適応と革新 Apr 11, 2025 am 12:01 AM

PHPの将来は、新しいテクノロジーの傾向に適応し、革新的な機能を導入することで達成されます。1)クラウドコンピューティング、コンテナ化、マイクロサービスアーキテクチャに適応し、DockerとKubernetesをサポートします。 2)パフォーマンスとデータ処理の効率を改善するために、JITコンパイラと列挙タイプを導入します。 3)パフォーマンスを継続的に最適化し、ベストプラクティスを促進します。

PHP対Python:違いを理解します PHP対Python:違いを理解します Apr 11, 2025 am 12:15 AM

PHP and Python each have their own advantages, and the choice should be based on project requirements. 1.PHPは、シンプルな構文と高い実行効率を備えたWeb開発に適しています。 2。Pythonは、簡潔な構文とリッチライブラリを備えたデータサイエンスと機械学習に適しています。

NavicatでMySQLへの新しい接続を作成する方法 NavicatでMySQLへの新しい接続を作成する方法 Apr 09, 2025 am 07:21 AM

手順に従って、NAVICATで新しいMySQL接続を作成できます。アプリケーションを開き、新しい接続(CTRL N)を選択します。接続タイプとして「mysql」を選択します。ホスト名/IPアドレス、ポート、ユーザー名、およびパスワードを入力します。 (オプション)Advanced Optionsを構成します。接続を保存して、接続名を入力します。

MySQLおよびSQL:開発者にとって不可欠なスキル MySQLおよびSQL:開発者にとって不可欠なスキル Apr 10, 2025 am 09:30 AM

MySQLとSQLは、開発者にとって不可欠なスキルです。 1.MYSQLはオープンソースのリレーショナルデータベース管理システムであり、SQLはデータベースの管理と操作に使用される標準言語です。 2.MYSQLは、効率的なデータストレージと検索機能を介して複数のストレージエンジンをサポートし、SQLは簡単なステートメントを通じて複雑なデータ操作を完了します。 3.使用の例には、条件によるフィルタリングやソートなどの基本的なクエリと高度なクエリが含まれます。 4.一般的なエラーには、SQLステートメントをチェックして説明コマンドを使用することで最適化できる構文エラーとパフォーマンスの問題が含まれます。 5.パフォーマンス最適化手法には、インデックスの使用、フルテーブルスキャンの回避、参加操作の最適化、コードの読み取り可能性の向上が含まれます。

PHP:それは死にかけていますか、それとも単に適応していますか? PHP:それは死にかけていますか、それとも単に適応していますか? Apr 11, 2025 am 12:13 AM

PHPは死にかけていませんが、常に適応して進化しています。 1)PHPは、1994年以来、新しいテクノロジーの傾向に適応するために複数のバージョンの反復を受けています。 2)現在、電子商取引、コンテンツ管理システム、その他の分野で広く使用されています。 3)PHP8は、パフォーマンスと近代化を改善するために、JITコンパイラおよびその他の機能を導入します。 4)Opcacheを使用してPSR-12標準に従って、パフォーマンスとコードの品質を最適化します。

phpmyadminを開く方法 phpmyadminを開く方法 Apr 10, 2025 pm 10:51 PM

次の手順でphpmyadminを開くことができます。1。ウェブサイトコントロールパネルにログインします。 2。phpmyadminアイコンを見つけてクリックします。 3。MySQL資格情報を入力します。 4.「ログイン」をクリックします。

See all articles