1. 最も適切なフィールド属性を選択する
たとえば、郵便番号フィールドを定義するときに、 2. フィールドをNOT NULLに設定してみる可能であれば、フィールドを 「都道府県」や「性別」などの一部のテキスト フィールドについては、ENUM (列挙) 型として定義できます。 MySQL では、ENUM 型は数値データとして扱われ、数値データはテキストデータよりもはるかに高速に処理されるためです。この方法でデータベースのパフォーマンスを向上させることができます。 3. サブクエリの代わりにJOINを使用するMySQL はバージョン 4.1 以降で SQL サブクエリをサポートしています。この手法を使用すると、SELECT ステートメントを使用してシングルトン クエリ結果を作成し、その結果を別のクエリのフィルター条件として使用できます。 たとえば、顧客基本情報テーブルに注文がない顧客を削除する場合は、次の図に示すように、サブクエリを使用して、まず販売情報テーブルから注文したすべての顧客の顧客 ID を取得し、その結果をメインクエリに渡すことができます。 JOIN を使用してこのタスクを完了すると、速度が大幅に向上します。特に、salesinfo テーブルの CustomerID にインデックスがある場合は、パフォーマンスが向上します。クエリは次のとおりです。 JOIN がより効率的である理由は、MySQL では論理的に 2 つのステップを必要とするこのクエリを完了するためにメモリ内に一時テーブルを作成する必要がないためです。 さらに、アプリケーションに多数の JOIN クエリがある場合は、JOIN される 2 つのテーブル内のフィールドにインデックスが付けられていることを確認する必要があります。このようにして、MySQL は JOIN SQL ステートメントを最適化するメカニズムを開始します。また、JOIN に使用するフィールドは同じタイプである必要があります。 たとえば、 DECIMAL フィールドを INT フィールドと JOIN すると、MySQL はそれらのインデックスを使用できません。これらの 内部 A.id、A.name、B.id、B.name を A から選択し、B を A.id=B.id で結合します。 A から A.id、A.name、B.id、B.name を選択し、B で右結合します。A.id= B.id; A.id =B.id の INNER JOIN から A.id、A.name、B.id、B.name を選択します。
A.id、A.name、B.id、B.name を A、B から選択します。WHERE A.id = B.id; 推奨事項:可能な場合は SQL には、内部結合、 たとえば、次の 2 つのテーブルがあるとします。 2 つのテーブルをクエリするには、 p.LastName、p.FirstName、o.OrderNo を選択 人物 p から INNER JOINの順序 ON p.Id_P=o.Id_P and 1=1 -- 複数の条件を接続するには and を使用します ORDER BY p.LastName クエリ結果セット: この接続方法では、Orders テーブルの Id_P フィールドに一致するものが Persons テーブル内に見つからない場合、そのフィールドはリストされません。 注: しかし、2 つのテーブルを結合する場合
ただし、この書き込み方法は標準に準拠しておらず、 内部結合クエリ (
2 つのテーブルをクエリするには、左結合を使用します。SQL は次のとおりです。 p.LastName、p.FirstName、o.OrderNo を選択 人物 p から LEFT JOIN 注文 o オン p.Id_P=o.Id_P ORDER BY p.LastName クエリ結果は次のとおりです。 左側のテーブル ( 右結合を使用して 2 つのテーブルをクエリします。SQL は次のとおりです。 p.LastName、p.FirstName、o.OrderNo を選択 人物 p から 右結合注文o オン p.Id_P=o.Id_P ORDER BY p.LastName クエリ結果は次のとおりです。 Orders テーブルの最後のレコードの Id_P フィールド値は 65 です。左側のテーブルには一致するレコードはありませんが、保持されています。 2 つのテーブルをクエリするには、完全結合を使用します。SQL は次のとおりです。 p.LastName、p.FirstName、o.OrderNo を選択 人物 p から FULL JOIN 注文 o オン p.Id_P=o.Id_P ORDER BY p.LastName クエリ結果は次のとおりです。 クエリの結果は、 4. 手動で作成した一時テーブルの代わりにUNIONを使用するMySQL はバージョン 4.0 以降、一時テーブルの使用を必要とする 2 つ以上の 重複する結果セットがないことが確認できる場合、または重複する結果セットを気にしない場合は、union ではなく union all を使用するようにしてください。union と union all の主な違いは、前者は、並べ替え、大量の CPU 操作の追加、リソース消費と待ち時間の増加を伴う一意のフィルタリング操作を実行する前に、2 つ以上の結果セットをマージする必要があることです。 5. 事務
特定のデータを 2 つの関連するテーブルに同時に挿入したいとします。次のような状況が発生する可能性があります。最初のテーブルが正常に更新された後、データベースで予期しない状況が突然発生し、2 番目のテーブルでの操作が完了しなくなります。これにより、データが不完全になったり、データベースのデータが破損したりします。この状況を回避するには、ステートメント ブロック内のすべてのステートメントが成功または失敗することを保証するトランザクションを使用する必要があります。 つまり、データベース内のデータの一貫性と整合性が維持されます。トランザクションは BEGIN キーワードで始まり、COMMIT キーワードで終了します。この期間中に SQL ステートメントが失敗した場合、Rollback コマンドを使用してデータベースを開始前の状態に復元できます。 始める; INSERTINTOsalesinfoSET顧客ID=14; UPDATEinventorySETQuantity=11WHEREitem='book'; 専念; トランザクションのもう 1 つの機能は、複数のユーザーが同時に同じデータ ソースを使用する場合に、データベースをロックすることでユーザーに安全なアクセス メカニズムを提供し、ユーザーの操作が他のユーザーによって妨害されないようにすることです。 一般的に、トランザクションは、
トランザクションの同時実行性の問題:
MySQL トランザクション分離レベル トランザクション制御ステートメント:
6. 外部キーを使用するロックテーブル方式ではデータの整合性は維持できますが、データの関連性を保証することはできません。このとき、外部キーを使用できます。たとえば、外部キーを使用すると、各販売レコードが既存の顧客を指していることを保証できます。 ここで、外部キーは CREATE TABLE customerinfo(customerid int primary key) engine = innodb; CREATE TABLE salesinfo( salesid int not null、customerid int not null、主キー(customerid、salesid)、外部キー(customerid) は、削除カスケードで customerinfo(customerid) を参照します)engine = innodb; 例のパラメータ「 7. テーブルをロックするトランザクションはデータベースの整合性を維持するための非常に優れた方法ですが、特に大規模なアプリケーション システムでは、その排他性がデータベースのパフォーマンスに影響を及ぼすことがあります。トランザクションの実行中はデータベースがロックされるため、他のユーザー要求はトランザクションが終了するまで一時的に待機することしかできません。 データベース システムを少数のユーザーのみが使用する場合、トランザクションの影響は大きな問題にはなりませんが、電子商取引 Web サイトへのアクセスなど、数千のユーザーが同時にデータベース システムにアクセスする場合、深刻な応答遅延が発生します。 実際、場合によってはテーブルをロックすることでパフォーマンスが向上することがあります。次の例は、前の例のトランザクション機能を完了するためにテーブルをロックする方法です。 ここでは、 8. インデックスを使用するインデックス作成は、データベースのパフォーマンスを向上させる一般的な方法です。これにより、データベース サーバーは、インデックスがない場合よりもはるかに高速に特定の行を取得できます。これは、クエリに では、どのフィールドをインデックス化すればよいのでしょうか? 一般的に、 たとえば、 さらに、MySQL はバージョン 3.23.23 以降で全文インデックスと検索をサポートしています。 MySQL の全文インデックスは 9. クエリ文を最適化する9.1 サブクエリを使用しない例: MySQL 5.5 では、内部実行プランナーは、最初に内部テーブル t2 をチェックするのではなく、最初に外部テーブルをチェックしてから内部テーブルと一致させるという方法でサブクエリを実行します。外部テーブルのデータが非常に大きい場合、クエリ速度は非常に遅くなります。 MariaDB10/MySQL5.6では、結合メソッドを使用して最適化されています。このSQL文は自動的に次のように変換されます。 t1 から t1.* を選択し、t2 を t1.id = t2.id として結合します。 ただし、最適化は 9.2 関数インデックスを避ける例: MySQL は Oracle のような関数インデックスをサポートしていないため、d フィールドにインデックスがあっても、テーブル全体が直接スキャンされます。 次のように変更する必要があります —–> SELECT * FROM t WHERE d >= '2016-01-01'; 9.3 ORをINに置き換える非効率的なクエリ SELECT * FROM t WHERE LOC_ID = 10 OR LOC_ID = 20 OR LOC_ID = 30; —–> 効率的なクエリ SELECT * FROM t WHERE LOC_IN IN (10,20,30); 9.4 LIKE二重パーセント記号はインデックスを使用できませんSELECT * FROM t WHERE name LIKE '%de%'; —–> SELECT * FROM t WHERE name LIKE 'de%'; 現在、MySQL 5.7 のみがフルテキスト インデックスをサポートしています (中国語をサポート) 9.5 適切なレコードを読む LIMIT M,Nt から * を選択し、1 を指定します。 —–> SELECT * FROM t WHERE 1 LIMIT 10; 9.6 データ型の不一致を避けるSELECT * FROM t WHERE id = '19'; —–> SELECT * FROM t WHERE id = 19; 9.7 グループ統計はソートを禁止する可能性があるSELECT goods_id,count(*) FROM t GROUP BY goods_id; デフォルトでは、MySQL は —–> SELECT goods_id,count(*) FROM t GROUP BY goods_id ORDER BY NULL; 9.8 ランダムなレコード取得を避けるSELECT * FROM t1 WHERE 1=1 ORDER BY RAND() LIMIT 4; MySQL は関数インデックスをサポートしていないため、テーブル全体のスキャンが発生します—–> SELECT * FROM t1 WHERE id >= CEIL(RAND()*1000) LIMIT 4; 9.9 不要なORDER BYソートを防ぐSELECT count(1) FROM user u LEFT JOIN user_info i ON u.id = i.user_id WHERE 1 = 1 ORDER BY u.create_time DESC; —–> count(1) を user u から LEFT JOIN user_info i ON u.id = i.user_id で選択します。 9.10 バッチ挿入t (id, name) に VALUES(1,'Bea') を挿入します。 t (id, name) に VALUES(2,'Belle') を挿入します。 t (id, name) に VALUES(3,'Bernice') を挿入します。 —–> t (id, name) に VALUES(1,'Bea'), (2,'Belle'),(3,'Bernice') を挿入します。 これで、MySQL データベースを最適化する 9 つのテクニックに関するこの記事は終了です。MySQL データベースの最適化に関連するその他のテクニックについては、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: SpringBoot でマイクロサービスを構築するために Docker を使用した実際の記録を分析する
>>: IE8でラベルの背景画像が表示されない問題の解決方法
フロントエンドcss3 フィルターは、Web ページのグレー効果を実現できるだけでなく、ナイト モー...
Dockerは複数のSpringbootを実行する1番目: ポートマッピング 2番目: メモリサイズ...
目次背景例誤解 - コールスタックを表示するためにウォッチでブレークポイントを設定する正しいアプロー...
解決すべき問題主にコンポーネント間のクロスレベル通信用なぜディスパッチとブロードキャストを自分で実装...
関連記事:初心者が学ぶ HTML タグ (4)導入された HTML タグは、必ずしも XHTML 仕...
序文インデックスは、データベース内の 1 つ以上の列の値を並べ替え、データベースが効率的にデータを取...
チェックボックスやラジオボタンの使用を含むコードをコピーコードは次のとおりです。 <!DOCT...
1. はじめにtr はテキストの一部を変換または削除するために使用されます。 tr は transl...
序文一部の CSS 相互作用の影響により、要素に設定されたz-index実際のサイズに応じて重ね合わ...
/etc/yum.repos.d/フォルダに入るrabbitmq-erlang.repo ファイルを...
今日はMySQLのインストール方法を学びましたが、その過程でいくつか問題が発生しました。関連記事をい...
開発の問題点開発プロセスでは、データベース フィールドが頻繁に変更されるため、RD 環境と QA 環...
目次NFS サービスの概要NFS とは何ですか? NFS マウントの原則NFS サーバーはデータ転送...
コード <div class="test"> <div>...
序文カバーリング インデックスについて説明する前に、まずそのデータ構造である B+ ツリーを理解する...