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 時間統計方法の概要

データベースの統計を行う場合、多くの場合、年、月、日に基づいてデータを収集し、echart を使用し...

Linux での vi (vim) の新しい使い方のまとめ

私は数年間 vi エディタを使ってきましたが、実用的な用途で使ったことはありませんでした。今日 Py...

Vue ルーティングフォールバックに最適なソリューション (vue-route-manager)

目次ルーティングマネージャー背景はじめる問題を解決する方法要約するルーティングマネージャー各ジャンプ...

HTML ハイパーリンク スタイル (4 つの異なる状態) の設定例

コードをコピーコードは次のとおりです。 <スタイル タイプ="text/css&qu...

Alibaba Cloud で MySQL リモート接続を構成するための詳細な手順

序文ご存知のとおり、デフォルトでは、Alibaba Cloud にインストールされている MySQL...

モバイル Web WAP には Bootstrap と jQuery Mobile のどちらを使用すべきか

問題を解決するBootstrap は、次の問題を解決する CSS フレームワークです。デバイス間での...

バックアップと削除のためにリアルタイムでステートメントを検出するMySQLトリガーの考え方の詳細な説明

問題の説明: ユーザーは、テーブルに「違反」という単語を含むフィールドが時々表示されることを要求して...

HTML 名、ID、クラス (フォーマット/アプリケーション シナリオ/機能) などの違いの紹介。

ページには多くのコントロール (要素またはタグ) があります。これらのタグをより便利に操作するには、...

ブロックレベル要素、インライン要素、可変要素の概要

ブロック要素p - 段落テキストの事前フォーマットテーブルol - ソートフォームul - 順序なし...

MySQL でコマンドを使用して階層検索を実現する方法の詳細な説明

序文この記事は主にMySQLコマンド階層検索ヘルプの使用に関する内容を紹介します。この記事のサンプル...

NavicatがMySQL8.0.11に接続するとエラー2059が発生する

間違いNavicat Premium を使用して MySQL に接続すると、次のエラーが発生します。...

Mysqlはブール型の演算を設定します

Mysqlはブール型を設定します1. Tinyintタイプテストテーブルを作成し、blフィールドをブ...

Docker を使用した MySQL のデプロイの詳細説明 (データ永続化)

この記事では、Docker を使用して MySQL をデプロイし、データを保持する方法について簡単に...

Node.js コンソールで強調表示されたコードを印刷する方法

序文コードを実行してエラーが発生すると、エラーが出力されます。エラーにはスタック情報が含まれており、...

画像をMySQLデータベースに保存し、フロントエンドページに表示するための実装コード

目次1. まず、pycharmを使用してDjangoプロジェクトを作成し、関連する環境を設定します。...