序文 データベースは常に私の弱点でした。自分の経験 (python+sqlalchemy) を組み合わせて、記録を作成します。私は ORM を使用することを好みます。SQL のスペルは苦痛であると常に感じています (主に SQL が得意ではないため)。また、以前のメンテナンス プロジェクトで、エンコードの問題、浮動小数点精度の低下など、データベースの落とし穴に遭遇したため、将来同じ落とし穴を繰り返さないようにしています。 第1章: ヘルプの使用 mysql組み込みヘルプコマンドを使用する
第2章: テーブルタイプの選択(ストレージエンジン) 最も一般的に使用される 2 つのエンジンは次のとおりです。 1. Myisam は MySQL のデフォルトのストレージ エンジンです。create で新しいテーブルを作成し、新しいテーブルのストレージ エンジンを指定しない場合は、デフォルトで Myisam が使用されます。 各 MyISAM はディスク上の 3 つのファイルに保存されます。ファイル名はテーブル名と同じで、拡張子は .frm (テーブル定義を保存)、.MYD (MYData、データを保存)、.MYI (MYIndex、インデックスを保存) です。データ ファイルとインデックス ファイルを異なるディレクトリに配置することで、IO を均等に分散し、速度を向上できます。 2. InnoDB ストレージ エンジンは、コミット、ロールバック、クラッシュ回復機能を備えたトランザクション セキュリティを提供します。ただし、MyISAM ストレージ エンジンと比較すると、InnoDB は書き込み効率が低く、データとインデックスを保持するためにより多くのディスク領域を占有します。 共通環境: 1. MyISAM: デフォルトのMySQLプラグインストレージエンジン。Web、データウェアハウス、その他のアプリケーション環境で最も一般的に使用されているストレージエンジンの1つです。 2. InnoDB: ACID トランザクション サポートを含む多くの機能を備え、トランザクション処理アプリケーションに使用されます。 第3章: 適切なデータ型の選択 まず、適切なストレージ エンジンを選択し、指定されたストレージ エンジンに基づいて適切なデータ型を決定します。
注意すべきデータの種類: 1. char と varchar: 保存方法と取得方法が異なり、最大長や末尾のスペースが保持されるかどうかも異なります。 char の長さは固定です。長さが足りない場合は、スペースが埋め込まれます。取得時に PAD_CHAR_TO_FULL_LENGTH が設定されていない場合、末尾のスペースはデフォルトで削除されます。 2. テキストと 3. 浮動小数点数 float と固定小数点数 10 進数: いくつかの点に注意してください: 1. 浮動小数点数はより広いデータ範囲を表現できますが、エラーの問題があります。 2. 通貨など、精度が重要な問題の場合は、固定小数点ストレージを使用する必要があります。以前のプロジェクトでいくつか問題に遭遇し、結局ズームインとズームアウトで解決しなければならなくなり、それは見苦しいものでした。 3. プログラミング中に浮動小数点数に遭遇した場合は、エラーの問題に注意し、浮動小数点数の比較を避けるようにしてください (浮動小数点数を比較するには、差が特定の精度未満である必要があります)。Python 3.5 では、次のように比較できます: 4. 浮動小数点数におけるいくつかの特殊な値の処理に注意してください。 第4章: 文字セット 最初に適切な文字セットを選択することが重要です。そうしないと、後で変更するのに非常にコストがかかります。文字セットは Python 2 における長年の課題であり、多くの初心者を混乱させています。以前私が管理していたプロジェクトでは、msyql のデフォルトの latin1 文字セットを使用していたため、文字列を書き込むたびに手動で utf8 にエンコードする必要がありました。最近、python3.5+flask を使用してプロジェクトを実行し、utf8 を直接使用しましたが、エンコードの問題は再び発生しませんでした。
第5章: インデックスの設計と使用 すべての MySQL 列タイプはインデックス化できます。関連する列にインデックスを使用することが、選択操作のパフォーマンスを向上させる最善の方法です。インデックス設計の原則: 1. 検索対象のインデックス列は、必ずしも選択される列ではありません。インデックス作成に最も適した列は、select キーワードに続く select リストに表示される列ではなく、where 句に表示される列、または join 句で指定される列です。 2. 一意のインデックスを使用します。インデックスは、一意の値を持つ列では適切に機能しますが、複数の重複値を持つ列では適切に機能しません。 3. 短いインデックスを使用します。文字列列にインデックスを付ける場合は、可能な限りプレフィックスの長さを指定する必要があります。 4. 一番左のプレフィックスを使用します。 n 列のインデックスを作成すると、実際には MySQL が使用できる n 個のインデックスが作成されます。複数列インデックスは、インデックス内の最も左の列セットを使用して行を一致させることができるため、複数のインデックスとして機能することができます。このような列セットは、最も左のプレフィックスになります。 5. インデックスを過剰に作成しないでください。インデックスはディスク領域を浪費し、書き込みパフォーマンスを低下させます。 6. 列に対して実行される比較の種類を考慮します。 第6章: ロック機構とトランザクション制御 InnoDB エンジンは行レベルのロックを提供し、共有ロックと排他ロックの 2 つのロック モードと 4 つの異なる分離レベルをサポートします。 MySQL は、AUTOCOMIT、START TRANSACTIONS、COMMIT、ROLLBACK などのステートメントを通じてローカル トランザクションをサポートします。 第7章: SQLにおけるセキュリティ問題 SQL インジェクション: 一部のデータベースの外部インターフェースを利用して、実際のデータベース操作言語 (sql) にユーザー データを挿入し、データベースやオペレーティング システムに侵入する目的を達成します。主な原因は、プログラムがユーザーによるデータ入力を厳密にフィルタリングせず、不正なデータベースクエリステートメントが実行されてしまうことです。予防策:
第8章: SQLモードと関連する問題 デフォルトの MySQL 実行モードを変更します。たとえば、厳密モードで挿入または更新が正しくない場合、MySQL はエラーを出して操作を中止します。 第9章: 一般的なSQLスキル
第10章: 注意が必要なその他の問題 データベース名とテーブル名の大文字と小文字の区別: プラットフォームやシステムによって大文字と小文字の区別が異なります。常に小文字の名前を使用することをお勧めします。 第11章: SQLの最適化 SQL を最適化するための一般的な手順: 1. show status および application characteristics を使用して、さまざまな SQL ステートメントの実行頻度と、さまざまな SQL ステートメントのおおよその実行比率を把握します。たとえば、InnoDB パラメータ Innode_rows_read は返された行数を照会し、Innodb_rows_inserted は挿入によって挿入された行数を実行し、Innodb_rows_updated は更新された行数を実行します。いくつかのパラメータもあります: MySQL サーバーへの接続試行の Connections、サーバーの稼働時間 Uptime、低速クエリの数 Slow_queries。 2. 実行効率が低い SQL ステートメントを見つけます。方法は 2 つあります。1 つは、スロー クエリ ログを使用して実行効率の低いステートメントを見つける方法です。--log-slow-queries[=file_name] オプションを指定して起動すると、mysqld は実行時間が long_query_time 秒を超えるすべての SQL ステートメントを含むログ ファイルを書き込みます。もう 1 つは、show processlist を使用して、スレッドの状態、テーブルがロックされているかどうかなど、MySQL の現在のスレッドを表示することです。SQL 実行状態をリアルタイムで表示し、一部のテーブル ロック操作を最適化できます。 3. EXPLAIN を使用して非効率的な SQL の実行プランを分析します。 EXPLAIN を使用すると、インデックスを使用してレコードを検索する SELECT を高速化するために、テーブルにインデックスを付ける必要があるタイミングがわかります。 以下は、EXPLAIN の実行後に取得される結果の説明です。
4. 問題を特定し、対応する最適化対策を講じます。 インデックス作成の問題
2つのシンプルで実用的な最適化方法
クライアント(コード側)の観点からの最適化
第12章: データベースオブジェクトの最適化 テーブル データ型を最適化: 分割によるテーブル アクセス効率の向上: ここでの分割は主に MyISAM タイプのテーブルを対象としています。
非正規化: 正規化設計では独立性を重視し、データの冗長性を最小限に抑えます。冗長性が高くなると、占有される物理スペースも大きくなり、データのメンテナンスや一貫性のチェックにも問題が発生します。適切な冗長性により、複数テーブルへのアクセスが削減され、クエリの効率が大幅に向上します。この場合、適切な冗長性による効率の向上を検討できます。 冗長統計テーブルを使用する: 統計分析に より適切なテーブル タイプを選択します。1. アプリケーションに深刻なロック競合がある場合は、ストレージ エンジンを意図的に InnoDB に変更するかどうかを検討してください。行ロック メカニズムにより、ロック競合の発生を効果的に減らすことができます。 2. アプリケーションに多くのクエリ操作があり、トランザクションの整合性に関する厳しい要件がない場合は、Myisam の使用を検討できます。 第13章: ロックの問題 ロックの待機: システム上のテーブル ロックの競合を分析するための table_locks_waited および table_locks_immediate ステータス変数。行ロックの競合を分析するには、Innode_row_lock をチェックします。 第14章: MySQLサーバーの最適化 MySQLサーバーの現在のパラメータを表示する
MySQLのパフォーマンスに影響を与える重要なパラメータ
第15章: I/Oの問題 ディスクシークはパフォーマンスの大きなボトルネックになります。
第16章: アプリケーションの最適化
要約する 上記はMySQLに関する関連コンテンツです。この記事の内容がMySQLの学習や使用に少しでも役立つことを願っています。ご質問がある場合は、メッセージを残してご連絡ください。 以下もご興味があるかもしれません:
|
XML スキーマは、DTD に代わる XML ベースのものです。 XML スキーマは、DTD に代わ...
Linux に puppeteer をインストールするときに、次の問題が発生する可能性があります。こ...
1. CSS スプライトを使用します。利点は、CSS で使用される小さな画像を 1 つの大きな画像に...
ソフトウェアのインストールをカスタマイズする場合、多くの場合、環境変数を設定する必要があります。以下...
1. インデックス不足または無効なインデックスによるクエリの遅延数千万件のデータを含むテーブルで、イ...
01. 概要絶対パスと相対パスはシェル環境でよく使用され、それぞれに独自の用途があります。相対パスの...
アップグレードの背景: MySQLの下位バージョンの脆弱性を解決するために、MySQLはMySQL ...
序文JavaScript では、document.querySelector("#demo...
公式、電子商取引、ソーシャル ネットワーキング、個人のいずれの Web サイトでも、訪問者に貴重な時...
1. スケジュールタスクを作成する命令crontab -eは現在のユーザーの編集インターフェースに入...
「これは革命になるだろう」という記事が出たあと。業界の皆様に認知され、もちろん内外からの評価もいただ...
擬似要素と擬似クラスところで、まずは疑似クラスセレクターと疑似要素セレクターについておさらいしておき...
この記事では、ウェブ計算機のマインスイーパゲームを実装するためのJavaScriptの具体的なコード...
主な機能は次のとおりです。製品情報を追加する製品情報を変更する単一の製品を削除する複数の製品を削除す...
背景ご存知のとおり、JavaEE プロジェクトを開発した後は、そのプロジェクトをサーバーの Tomc...