この記事では、MySQL インデックスの使用法を例とともに分析します。参考のために皆さんと共有してください。詳細は次のとおりです:
MYSQLの説明:
カテゴリと記事の 2 つのテーブルを持つ記事ライブラリ。カテゴリには分類されたデータが 10 件あります。記事の数は20万件あります。 category の「category_id」フィールドに対応する、article の「article_category」フィールドがあります。単語「article_category」は、article テーブルのインデックスとして定義されています。データベースのサイズは1.3Gです。
問題の説明:
非常に一般的なクエリを実行します:
コードは次のとおりです:
SELECT * FROM `article` WHERE Article_category=11 ORDER BYarticle_id DESC LIMIT 5
実行時間は約5秒です解決策:
インデックスを作成します:
コードは次のとおりです:
記事 (article_category,article_id) にインデックス idx_u を作成します;
コードは次のとおりです:
SELECT * FROM `article` WHERE Article_category=11 ORDER BYarticle_id DESC LIMIT 5
0.0027 秒に短縮質問を続けます:
コードは次のとおりです:
SELECT * FROM `article` WHERE Article_category IN (2,3) ORDER BYarticle_id DESC LIMIT 5
実行時間は 11.2850 秒です。またはを使用します:
リーリー
実行時間: 11.0777
解決策: or or での使用は避けてください (テーブルスキャンが発生するため)、union all を使用してください
UNION ALL を使用する:
リーリー
実行時間: 0.0261
注: UNION と UNION ALL の違い
データベースでは、UNION キーワードと UNION ALL キーワードはどちらも 2 つの結果セットを 1 つにマージしますが、使用方法と効率の点で異なります。
UNION はテーブルのリンク後に重複レコードをフィルターで除外するため、テーブルのリンク後、生成された結果セットを並べ替え、重複レコードを削除して結果を返します。
実際のアプリケーションのほとんどでは、重複レコードは生成されません。最も一般的なものは、プロセス テーブルと履歴テーブルの UNION です。例:
リーリー
この SQL は、実行時に最初に 2 つのテーブルの結果を取得し、次にソート スペースを使用して重複レコードをソートおよび削除し、最後に結果セットを返します。テーブル データが大きい場合は、ディスクがソートに使用されることがあります。
UNION ALL は、2 つの結果を単純に結合して返します。このように、返された 2 つの結果セットに重複データがある場合、返された結果セットには重複データが含まれます。
効率の点では、UNION ALL は UNION よりもはるかに高速であるため、マージされた 2 つの結果セットに重複データが含まれていないことが確認できた場合は、次のように UNION ALL を使用します。
リーリー
注: mysql のすべての結合の問題で順序付けします
今日mysqlデータベースのコードを書いていたら、unionの結果が予期していないことに気づきましたリーリー
$sql1と$sql2をそれぞれ実行すると正しい結果になります
しかし、$sqlを実行すると結果が逆転し、$sql1の部分が昇順に、$sql2の部分が降順に変わっていることが分かりました
検索では満足のいく答えが得られませんでした。
によっては語順をサポートしていないデータベースもあるようです。
これが機能することを偶然発見しました:
コードは次のとおりです:
この記事が皆さんの MySQL データベース計画に役立つことを願っています。