1. innodb の代わりに myisam を使用します
MySQL チュートリアル データベース チュートリアル エンジンは数多くありますが、最もよく目にするのは myisam と innodb です。
mysql はデフォルトで myisam を使用します。ただし、非常に単純なデータベースや実験的なデータベースを作成する場合を除き、多くの場合、これは適切な選択ではありません。外部キー制約またはトランザクションはデータの整合性にとって非常に重要ですが、myisam はこれらをサポートしていません。また、レコードの挿入や更新を行うとデータテーブル全体がロックされるため、使用量が増えると作業効率が非常に悪くなります。
結論は簡単です: innodb を使用します。
2.phpチュートリアルでmysql関数を使用する
php は、作成された日から (または、ほとんど違いがない限り)、mysql ライブラリ関数を提供してきました。 PHP マニュアルには次のように書かれていますが、多くのアプリケーションは依然として mysql_connect、mysql_query、mysql_fetch_assoc などの関数を使用しています。
mysql v4.1.3 以降を使用している場合は、mysqli 拡張機能を使用することを強くお勧めします。mysqli (mysql 拡張機能の拡張バージョン) には次の利点があります:
オプションのオブジェクト指向インターフェイス
SQL インジェクション攻撃を防止し、パフォーマンスを向上させる準備された式
より多くの表現とトランザクションをサポートします
さらに、複数のデータベース システムをサポートしたい場合は、pdo を検討することもできます。
3. ユーザー入力は処理されません
これは #1 のように言えます: ユーザー入力を決して信頼しないでください。サーバー側の PHP を使用して各文字列を検証し、Web ページの効果に依存しないでください。最も単純な SQL インジェクション攻撃では、次のコードが使用されます:
ソースプリントを表示?1 $username = $_post["name"];
2 $パスワード = $_post["パスワード"]
3 $sql = "username='$username' およびpassword='$password' である usertable から userid を選択します。";
4 // クエリを実行...
ユーザー名フィールドに「admin';--」と入力するだけで、ハッキングされます。対応する SQL ステートメントは次のとおりです。
sourceprint を表示しますか?1 username='admin';の usertable から userid を選択します狡猾なハッカーは管理者としてログインでき、パスワードフィールドはコメントアウトされているため、パスワードを知る必要はありません。
4. UTF-8は使用されません
私たち米国、英国、オーストラリアでは、英語以外の言語を考慮することはほとんどありません。私たちは誇りを持って「傑作」を完成させましたが、他の場所ではうまく機能しないことがわかりました。
utf-8 は多くの国際化の問題を解決します。 PHP v6.0 より前では十分にサポートされていませんが、MySQL 文字セットを UTF-8 に設定することには影響しません。
5. SQL よりも php を優先します
MySQL を短期間使用したことがある場合は、すでに習得した言語を使用して問題を解決する傾向があり、冗長で非効率なコードを作成することになります。たとえば、MySQL に付属の avg() 関数は使用せず、まずレコード セット内の値を合計し、次に PHP ループを使用して平均を計算します。
また、PHP ループ内の SQL クエリにも注意してください。一般に、結果を反復処理するよりもクエリを実行する方が効率的です。
そのため、データを分析する際には、SQL を知っておくと非常に役立ちます。
6. データベースクエリの最適化なし
PHP パフォーマンスの問題の 99% はデータベースによって引き起こされます。たった 1 つの悪い SQL クエリが Web アプリケーションを完全に麻痺させる可能性があります。 MySQL の Explain ステートメント、クエリ プロファイラー、その他の多くのツールは、これらの悪い選択を特定するのに役立ちます。
7. データ型が正しく使用できません
mysql は、数値、文字列、日付などのデータ型を提供します。時刻を保存する場合は、日付型または日時型を使用します。この時点で整数または文字列型を使用すると、その型を定義するために整数または文字列を使用できる場合、SQL クエリが非常に複雑になります。
多くの人は、シリアル化された PHP オブジェクトを格納するために文字列を使用するなど、承認なしに一部のデータの形式をカスタマイズする傾向があります。これによりデータベースの管理が容易になる可能性がありますが、MySQL のデータ ストアとしては不十分になり、後で障害が発生する可能性が高くなります。
8. クエリで *
を使用します。
データテーブルのすべての列のデータを返すために * を使用しないでください。これは怠惰です。必要なデータを抽出する必要があります。すべてのフィールドが必要な場合でも、データ テーブルは必然的に変更されます。
9. インデックスを使用しない、またはインデックスを過剰に使用する
一般原則は次のとおりです: select ステートメントの where 句で表されるフィールドはインデックスを使用する必要があります。
たとえば、数値 ID (主キー) と電子メール アドレスを含むユーザー テーブルがあるとします。ログインするとき、mysql は電子メールに基づいて正しい ID を検索する必要があります。インデックスが使用されている場合 (ここでは電子メールを指します)、MySQL はより高速な検索アルゴリズムを使用して電子メールを見つけることができ、それは瞬時であるとも言えます。それ以外の場合、MySQL は正しい電子メール アドレスが見つかるまで各レコードを順番にチェックすることしかできません。
各フィールドにインデックスを追加する人もいますが、残念ながら、これらのインデックスは挿入または更新の実行後に再生成する必要があり、パフォーマンスに影響します。したがって、インデックスは必要な場合にのみ追加してください。
10. バックアップするのを忘れました!
まれではありますが、データベースがクラッシュする危険性があります。ハードドライブが損傷したり、サーバーがクラッシュしたり、Web ホスティングプロバイダーが破産したりする可能性があります。 MySQL データを失うと致命的となるため、自動バックアップを使用しているか、コピーを用意していることを確認してください。
11. おまけの間違い - 他のデータベースの使用を考慮しないでください
MySQL は PHP 開発者にとって最も広く使用されているデータベース システムかもしれませんが、これが唯一の選択肢ではありません。 PostgreSQL と Firebird が最も有力な候補です。どちらもオープンソースであり、どちらも同社に買収されていません。 Microsoft は SQL Server Express、Oracle は 10g Express を提供しており、どちらもエンタープライズ レベルのデータベースの無料バージョンです。場合によっては、小規模な Web アプリケーションや組み込みアプリケーションの場合、sqlite が代替手段になることもあります