MySQL コール初心者が犯しがちな 11 の間違いのまとめ

MySQL コール初心者が犯しがちな 11 の間違いのまとめ

序文

セキュリティ部門からSQLインジェクションやXSS攻撃の脆弱性などに関する警告メールを頻繁に受け取ったり、時にはハッカーにコンピュータがハッキングされたりすることがあります。イライラしませんか?データベースの実行が遅すぎます (経験上、これは基本的にインデックスの誤った使用が原因です)。エディターに従って、MYSQL 初心者が犯す 11 の一般的な間違いを見てみましょう。

1. InnoDBの代わりにMyISAMを使用する

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

デフォルトでは MyISAM が使用されます。しかし、非常に単純なデータベースをセットアップしている場合や、単に実験している場合を除いて、ほとんどの場合、これは間違った選択です。 MyISAM は、データの整合性を確保するための本質である外部キー制約をサポートしていません。さらに、MyISAM はデータの追加や更新時にテーブル全体をロックするため、将来の拡張パフォーマンスに大きな問題が生じます。

解決策は簡単です。InnoDB を使用します。

2. PHPのmysqlメソッドを使用する

PHP は当初から MySQL 関数ライブラリを提供してきました。多くのプログラムはmysql_connect、mysql_query、mysql_fetch_assocなどに依存していますが、

PHP マニュアルでは次のように提案されています:

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

mysqli (MySQL Advanced Extensions) にはいくつかの利点があります。

オブジェクト指向インターフェースを持つ

準備されたステートメント(前処理されたステートメントは、SQL インジェクション攻撃を効果的に防止し、パフォーマンスを向上させることができます)

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

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

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

正しくは、「ユーザー入力を決して信頼しないでください」です。各入力情報を検証およびフィルタリングするにはバックエンド PHP を使用し、JAVAscript を信頼しないでください。次のような SQL ステートメントは簡単に脆弱になります。

$username = $_POST["名前"]; 
$password = $_POST["パスワード"]; 
$sql = "SELECT userid FROM usertable WHERE username='$username'AND password='$password';"; // クエリを実行...

ユーザーがこのコードに「admin';」と入力すると、次のコードと同等になります。

usertable から userid を選択します。WHERE username='admin';

この方法では、侵入者はパスワードを入力せずに管理者としてログインできます。

4. UTF-8を使用していない

英国と米国のユーザーは言語の問題をほとんど考慮しないため、多くの製品が他の場所で使用できなくなります。 GBK でエンコードされたものもいくつかありますが、これもまた多くの問題を引き起こします。

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

5. SQLを使うべきところではPHPを使う

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

また、SQL クエリ内の PHP ループにも注意してください。通常、すべての結果が取得されたら、PHP で結果をループする方が効率的です。

一般的に、大量のデータを処理する際に強力なデータベース メソッドを使用すると、効率が向上します。

6. クエリを最適化しない

PHP のパフォーマンスの問題の 99% はデータベースが原因です。不適切な SQL ステートメントにより、プログラム全体が非常に遅くなる可能性があります。 MySQL の EXPLAIN ステートメント、クエリ プロファイラ、その他多くのツールは、問題のある SELECT を見つけるのに役立ちます。

7. 間違ったデータ型の使用

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

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

8. SELECTクエリで*を使用する

テーブル内のすべてのフィールドを返すために * を使用しないでください。非常に遅くなります。必要なデータ フィールドのみを抽出する必要があります。すべてのフィールドを削除する必要がある場合は、テーブルを変更する必要がある可能性があります。

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

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

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

この場合、各フィールドにインデックスを追加したい場合がありますが、これを行うと、更新または追加時にインデックスがやり直され、データ量が多い場合にパフォーマンスの問題が発生します。したがって、必要なフィールドのみにインデックスを付けます。

10. バックアップをとらない

頻繁に発生することはないかもしれませんが、データベースの破損、ハード ドライブの障害、サービスの停止などにより、データに壊滅的な損害が発生する可能性があります。したがって、常にデータを自動的にバックアップするか、コピーを保存するようにしてください。

11. さらに: 他のデータベースを考慮しない

MySQL は PHP で最も一般的に使用されるデータベースかもしれませんが、唯一の選択肢ではありません。 PostgreSQL と Firebird も競合相手ですが、どちらもオープンソースであり、特定の企業によって管理されていません。 Microsoft は SQL Server Express を提供し、Oracle は 10g Express を提供しており、これらのエンタープライズ レベルのものには無料バージョンもあります。 SQLite は、一部の小規模なアプリケーションや組み込みアプリケーションにも適しています。

要約する

上記がこの記事の全内容です。この記事の内容が、MySQL の学習や使用に携わる皆様のお役に立てれば幸いです。ご質問がある場合は、メッセージを残してご連絡ください。

以下もご興味があるかもしれません:
  • MySQL データベースとテーブルを操作するための一般的なコマンドの初心者向けガイド
  • 初心者向け PHP デバッグ環境の設定 (IIS+PHP+MYSQL)
  • MySQL 初心者ガイド - クイックリファレンス
  • 一般的な MySQL エラー プロンプトの処理の概要
  • よくある MySQL エラーのコレクション
  • よくあるMySQLエラーとその解決策を紹介します
  • MySQL の一般的なエラー分析と解決策
  • よくあるMySQLエラーとは?よくあるMySQLエラーの簡単な解決方法

<<:  ドラミング効果を実現するJavascript

>>:  Linux で MySQL データベースのスケジュールされたバックアップを実装する簡単な方法

推薦する

MySQL データベースのインポートとエクスポートのデータ エラーの解決例の説明

データのエクスポートエラーを報告する 「secure_file_priv」のような変数を表示します。...

Dockerコマンドの自動補完の実装

序文この友人がどれくらいDockerを使っていなかったのかは分かりませんが、突然Dockerコマンド...

nginxのデフォルトポートを変更する方法の詳細な説明

まず設定ファイルがどこにあるか調べる nginx.confはどこにありますかこれらのディレクトリを調...

MySQLデータベースのロック機構の分析

同時アクセスの場合、非反復読み取りやその他の読み取り現象が発生する可能性があります。高い同時実行性に...

HTML テーブルタグチュートリアル (24): 行の水平方向の配置属性 ALIGN

水平方向では、行の配置を左、中央、右に設定できます。基本的な構文<TR ALIGN="...

MySQL 8.0.20 圧縮版のインストールチュートリアル(画像とテキスト付き)

1. MySQL ダウンロード アドレス。 http://ftp.ntu.edu.tw/MySQL...

Vue における $router と $route の違いの詳細な説明

通常、vue プロジェクトではルーティングを使用します。vue-router は vue.js の公...

HTML フォームタグチュートリアル (4):

ここで、次のような項目をフォームに追加したいとします: 現在いる都市を参照します。ここで私たちが話し...

CSS を使用して複数の方法で等幅レイアウトを実装するサンプルコード

この記事で説明する等幅レイアウトでは、純粋な CSS を使用して、要素の幅を手動で設定することなく、...

MySQLの文字列インターセプト関連関数の概要

この記事では、MySQL の文字列インターセプト関連の機能を紹介します。具体的な内容は以下のとおりで...

VMware vCenter の不正な任意ファイルアップロードの脆弱性 (CVE-2021-21972) について

背景CVE-2021-21972 VMware vCenter における認証されていないコマンド実行...

Ubuntuのpython3でvenvを使用して仮想環境を作成する

1. 仮想環境はプロジェクトに従い、単一のプロジェクト用の仮想環境を作成します(Python 3.4...

MYSQL スロークエリとログの例の説明

1. はじめにスロークエリログを有効にすると、MySQL は指定された時間を超えるクエリステートメン...

Vue で Google サードパーティ ログインを実装するためのサンプル コード

目次1. 開発者プラットフォームの構成問題を解決する1. 開発者プラットフォームの構成1. 開発者プ...

SSH経由でローカルLinux仮想マシンに接続するプロセスを記録する

実験環境:物理マシン Windows 10 x64物理NIC情報IPv4 アドレス: 192.168...