この記事では、PHP データベース プログラミングのための MySQL 最適化戦略について簡単に説明します。参考のために皆さんと共有してください。詳細は次のとおりです:
数日前、PHP のボトルネックは多くの場合 PHP 自体ではなく、データベースにあるという記事を目にしました。 PHP 開発では、データの追加、削除、変更、チェックが中心であることは誰もが知っています。 PHP の動作効率を向上させるには、プログラマは明確なロジックで効率の高いコードを作成するだけでなく、クエリ ステートメントを最適化できる必要があります。データベースの読み取りおよび書き込み速度についてはどうすることもできませんが、いくつかのデータベース クラス拡張機能や、memcache、mongodb、redis などのデータ ストレージ サーバーの助けを借りて、PHP はより高速なアクセス速度も実現できるため、理解して学習してください。これらの拡張機能も非常に必要です。この記事ではまず、MySQL の一般的な最適化戦略について説明します。
MySQL のいくつかのヒント
1. SQL ステートメント内のキーワードは大文字で記述するのが最適です。第 2 に、SQL ステートメントが実行されるときに、キーワードと操作オブジェクトを区別するのが簡単です。大文字を手動で記述すると、クエリの効率が (わずかではありますが) 向上します。2. データベース内のデータ行を追加または削除すると、データ ID が大きすぎます。
ALTER TABLE tablename AUTO_INCREMENT=N を使用して、N から始まる自動インクリメント ID を作成します。 3. int 型に
ZEROFILL 属性を追加して、データに 0 を自動的に追加します。 4. 大量のデータをインポートする場合は、最初にインデックスを削除し、データを挿入してからインデックスを追加することをお勧めします。そうしないと、MySQL はインデックスの更新に多くの時間を費やします。
5. データベースを作成して SQL ステートメントを記述する場合、IDE で .sql という接尾辞が付いたファイルを作成できるため、IDE は SQL 構文を認識し、記述が容易になります。さらに重要なのは、データベースが失われた場合でも、このファイルを見つけて、現在のディレクトリで
/path/mysql -uusername -ppassword データベース名 0fededbf9b2c51306d97e041f0e42b51const>eq_ref>ref>range>index>all
possible-keys:可能使用到的索引
key 使用到的索引
key_len索引长度
ref 使用哪个列与索引一起从表中选择。
rows 查找到数据要扫描的大概行数,可看出索引的优劣
extra 常见的有
using filesort 查询到数据后进行文件排序,较慢,需要优化索引
using where 读取整行数据后进行判断过滤,是否符合where条件
using index 索引覆盖,即在牵引中已经有这存储了目标数据,直接读取索引,很快。
PROFILE
用SELECT @@frofiling来查看PROFILE的开启状态。
如果未开启,用SET profiling=1来开启。
开启之后,再执行查询语句,MySQL会自动记录profile信息。
应用show profiles查看所有的sql信息,结果为 Query_ID Duration Query三列结果,分别是查询ID,用时和所用的sql语句。
我们可以使用
SHOW PFROFILE [type[,type]][FOR QUREY Query_ID][Limit rwo_count [OFFSET offset]]
type常见有ALL(全部) BLOCK IO(显示IO相关开销) CPU(CPU开销) MEMORY(内存开销)等
大型存储方面优化
数据库主从复制和读写分离
1、master将改变记录到二进制日志中,slave将master的二进制拷贝到它的中继日志中,重新将数据返回到它自己的数据中,达到复制主服务器数据的目的。
主从复制可以用作:数据库负载均衡、数据库备份、读写分离等功能。
2、配置主服务器master
修改my.ini/my.conf
[mysqld] log-bin=mysql-bin //启用二进制日志 server-id=102 //服务器唯一ID
3、配置从服务器slave
log-bin=mysql-bin //启用二进制日志 server-id=226 //服务器唯一ID
4、在主服务器上授权从服务器
GRANT REPLICATION SLAVE ON *.* to 'slavename'@'IP' identified by 'root'
5、在从服务器上使用
マスターを
master_host="masterip",
master_user="masteruser",
master_password="masterpasswd";
に変更します。 次に、start smile コマンドを使用してマスター/スレーブ レプリケーションを開始します。
設定を変更するたびにサーバーを再起動することを忘れないでください。その後、マスターサーバーとスレーブサーバーで show master/slave status を使用してマスター/スレーブのステータスを表示できます。
データベースでの読み取りと書き込みの分離を実現するには、mysql_proxy、atlas などの MySQL ミドルウェアに依存します。これらのミドルウェアをマスターサーバーとスレーブサーバーで読み取りと書き込みを分離するように構成することで、スレーブサーバーが読み取りを担当するようになり、マスターサーバーの負担が軽減されます。
データベースの共有
データベース内のデータテーブルのデータ量が非常に大きい場合、インデックス作成であってもキャッシュであっても、データベースをシャーディングして使用できるようにすることは大きな負担となります。複数のデータベース サーバーまたは複数のテーブル ストレージを使用して、クエリの負荷を軽減します。
この方法には、垂直セグメンテーション、水平セグメンテーション、および複合セグメンテーションが含まれます。
垂直セグメンテーション: 多数のデータテーブルがある場合、データベース内で密接に関連するテーブル (同じモジュール、頻繁に接続されクエリが実行されるなど) を分割し、異なるマスター/スレーブサーバーに配置します。
水平シャーディング: テーブルの数はそれほど多くないが、テーブル内のデータの量が非常に多い場合、クエリを高速化するために、ハッシュやその他のアルゴリズムを使用してデータテーブルをいくつかに分割して配置できます。クエリを高速化するために、別のサーバー上で実行します。水平シャーディングとデータテーブルパーティショニングの違いは、ストレージメディアの違いにあります。
結合分割: 多くの場合、データテーブルとテーブル内のデータ量が非常に大きいため、結合分割が必要になります。つまり、垂直方向と水平方向のテーブル分割が同時に実行され、データベースが分散行列に分割して格納されます。
これらのデータベース最適化手法はそれぞれ、記事を書くために使用できます。これらの手法を理解して覚えておくと、必要に応じて目的を持った選択と最適化を実行して、データベースの効率を高めることができます。
次に、一般的に使用される PHP データベース クラス拡張機能である memcache、redis、mongodb の基本的な使用シナリオと使用方法をさらにまとめます。
以上がPHP での MySQL データベース最適化戦略の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。