ホームページ  >  記事  >  データベース  >  見なければならないものだ! PHP 開発者が犯す MySQL の 10 の間違い

見なければならないものだ! PHP 開発者が犯す MySQL の 10 の間違い

silencement
silencement転載
2020-01-23 22:18:331730ブラウズ

見なければならないものだ! PHP 開発者が犯す MySQL の 10 の間違い

1. InnoDB ではなく MyISAM を使用する

MySQL には多くのデータベース エンジンがあり、一般的に MyISAM と InnoDB が使用されます。

MyISAM がデフォルトで使用されます。しかし、非常に単純なデータベースを構築している場合や、単に実験的に行っている場合を除き、ほとんどの場合、これは間違った選択です。

MyISAM は、データの整合性を確保するための本質である外部キー制約をサポートしていません。さらに、MyISAM はデータの追加または更新時にテーブル全体をロックするため、

将来の拡張パフォーマンスに大きな問題が発生します。

解決策は簡単です。InnoDB を使用します。ただし、ここでは一般的に、PHP の mysql メソッドを使用して、MyISAM

2 を試してみました。

PHP は、最初から MySQL 関数ライブラリを提供しています。多くのプログラムは mysql_connect、mysql_query、mysql_fetch_assoc などに依存していますが、PHP マニュアルでは次のように推奨しています。

使用している MySQL バージョンが 4.1.3 以降の場合は、mysqli 拡張機能を使用することを強くお勧めします。

Mysqli、つまり MySQL の高度な拡張機能には、いくつかの利点があります。

オブジェクト指向インターフェイスを備えています。

準備されたステートメント (準備されたステートメント。SQL の実行を効果的に防止できます)。インジェクション攻撃を防ぎ、パフォーマンスも向上します)

複数のステートメントとトランザクションをサポート

さらに、複数のデータベースをサポートしたい場合は、PDO を検討する必要があります。

3. ユーザー入力をフィルタリングしない

ユーザー入力を決して信頼しないでください。バックエンド PHP を使用して、各入力情報を検証およびフィルタリングします。JavaScript は信頼しないでください。次のような SQL ステートメントは簡単に攻撃される可能性があります:

$username = $_POST["name"];  
$password = $_POST["password"];  
$sql = "SELECT userid FROM usertable WHERE username='$username'AND password='$password';"; // run query...

このようなコードは、ユーザーが「admin';」と入力した場合、次のコードと同等です:

SELECT userid FROM usertable WHERE username='admin';

これにより、侵入者はパスワードを入力せずに管理者としてログインできます。 4. UTF-8 を使用しないでください

イギリスとアメリカの国々のユーザーは言語の問題をほとんど考慮しないため、他の地域では使用できない製品が多くあります。多くの問題を引き起こす GBK エンコーディングもいくつかあります。

UTF-8 は、国際化に関する多くの問題を解決します。 PHP6 ではこの問題をより完全に解決できますが、MySQL の文字セットを UTF-8 に設定することはできます。

5. SQL を使用する必要がある場合は PHP を使用する


MySQL を初めて使用する場合は、問題を解決するときに最初に PHP を使用することを検討することがあります。使い慣れた言語で解決します。これにより、無駄が発生し、パフォーマンスが低下する可能性があります。例: 平均を計算する場合、ネイティブの MySQL AVG() メソッドは使用されず、代わりに PHP がすべての値をループし、それらを累積して平均を計算します。

SQL クエリ内の PHP ループにも注意してください。通常は、すべての結果が取得された後に PHP をループする方が効率的です。
一般に、大量のデータを処理する場合、強力なデータベース手法を使用すると効率が向上します。

6. クエリが最適化されていない

PHP パフォーマンスの問題の 99% はデータベースが原因であり、不適切な SQL ステートメントによりプログラム全体が停止する可能性があります。非常に遅い。 MySQL の EXPLAIN ステートメント、Query

Profiler、その他多くのツールは、不正な SELECT を見つけるのに役立ちます。
7. 間違ったデータ型の使用

MySQL は、数値、文字列、時刻などの一連のデータ型を提供します。日付を保存したい場合は、DATE 型または DATETIME 型を使用します。整数または文字列を使用すると、処理がより複雑になります。

文字列を使用してシリアル化された PHP オブジェクトを保存するなど、独自のデータ型を使用したい場合があります。データベースを追加するのは簡単かもしれませんが、そうすると MySQL が扱いにくくなり、後で問題が発生する可能性があります。

8. SELECT クエリでは *

を使用します。テーブル内のすべてのフィールドを返すには * を使用しないでください。非常に時間がかかります。必要なデータフィールドを取り出すだけです。すべてのフィールドを削除する必要がある場合は、テーブルの変更が必要になる場合があります。

9. インデックスの不足またはインデックスの過剰設定

一般的に、SELECT ステートメントの WHERE の後に出現するすべてのフィールドにインデックスを付ける必要があります。

たとえば、ユーザー テーブルに数値 ID (主キー) と電子メール アドレスがあるとします。ログイン後、MySQL は電子メールを通じて対応する ID を見つける必要があります。インデックス作成により、MySQL は検索アルゴリズムを通じて メールを迅速に見つけることができます。インデックスがないと、MySQL はレコードが見つかるまですべてのレコードをチェックする必要があります。

この場合、各フィールドにインデックスを追加することもできますが、その結果、更新または追加するときにインデックスが再作成されることになります。データ量が多い場合

、パフォーマンスの問題が発生します。したがって、必須フィールドのみにインデックスを付けます。

10. バックアップが行われない

頻繁に起こることではないかもしれませんが、データベースの損傷、ハードディスクの障害、サービスの停止などにより、大惨事が発生する可能性があります。破壊のデータ。したがって、データまたは

を自動的にバックアップするか、コピーを保存する必要があります。

以上が見なければならないものだ! PHP 開発者が犯す MySQL の 10 の間違いの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はwww.liqingbo.cnで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。