ホームページ >データベース >mysql チュートリアル >MySQL インデックスの使用例分析_MySQL

MySQL インデックスの使用例分析_MySQL

WBOY
WBOYオリジナル
2016-08-20 08:48:141018ブラウズ

この記事では、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の部分が降順に変わっていることが分かりました

検索では満足のいく答えが得られませんでした。

によっては語順をサポートしていないデータベースもあるようです。

これが機能することを偶然発見しました:


コードは次のとおりです:

$sql = "select * from ($sql1) as temp1 Union all select * from ($sql2) as temp2";

これは、union の使用法が間違っているためです。ユニオン操作では、order by ステートメントをユニオン操作で結合された 2 つの select ステートメントに含めることはできません。並べ替えは、2 番目の select ステートメントの後に order by 句を指定することで実行できます。
さらに MySQL 関連のコンテンツに興味のある読者は、このサイトの特別トピックをチェックしてください:「MySQL インデックス操作スキルの概要」、「MySQL ログ操作スキルの総合集」、「MySQL トランザクション操作スキルのまとめ」、「 MySQL ストアド プロシージャ スキルの総合集」、「MySQL データベース ロック関連スキルのまとめ」、「よく使われる MySQL 関数のまとめ」

この記事が皆さんの MySQL データベース計画に役立つことを願っています。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。