ホームページ  >  記事  >  データベース  >  mysql ユニオンインデックスの利点は何ですか? ジョイントインデックスの意味

mysql ユニオンインデックスの利点は何ですか? ジョイントインデックスの意味

零下一度
零下一度オリジナル
2017-05-08 14:58:376939ブラウズ

Mysql 「ジョイントインデックス」を作成する意味は何ですか?

質問?
「共同インデックス」を作成する必要があるのは何ですか?最も実用的な利点は何ですか?データのクエリを高速化するためなら、単一列のインデックスがあっても問題ないのではないでしょうか?なぜ「共同インデックス」が存在するのでしょうか? 簡単に言えば、主な理由は 2 つあります:

    「1 つは 3 の価値がある」。 (a, b, c) の複合インデックスを構築する場合、インデックスが追加されるたびに書き込み操作が増加するため、実際には 3 つのインデックス (a)、(a, b)、(a, b, c) を構築するのと同じになります。オーバーヘッドとディスク容量のオーバーヘッド。大量のデータを含むテーブルの場合、これは大きなオーバーヘッドになります。
  • カバーインデックス。次の SQL がある場合、同じものに複合インデックス (a、b、c) があります: select a、b、c from table where a=1 and b = 1。これにより、MySQL はテーブルを返さずにインデックスを走査することで直接データを取得できるようになり、多くのランダムな IO 操作が削減されます。 IO 操作、特にランダム IO の削減は、実際には DBA の主要な最適化戦略です。したがって、実際の実際のアプリケーションでは、インデックスをカバーすることがパフォーマンスを向上させるための主要な最適化方法の 1 つとなります。インデックス列の数が増えると、インデックスによって除外されるデータが少なくなります。 1,000 万個のデータを含むテーブルには次の SQL があります: select
  • from table where a = 1 and b =2 and c = 3. 値が 1 つしかない場合、各条件でデータの 10% を除外できると仮定します。インデックスは、1000W

    10%=100w 個のデータをフィルターで除外し、テーブルに戻って 100w 個のデータから b=2 と c=3 に一致するデータを見つけて並べ替えます。それから

    ページング
  • ; 複合インデックスの場合は、インデックスを使用して 1000w
  • 10%

    10% *10%=1w を使用し、どちらがより効率的か一目でわかります次のテーブル

    create table test(
        a int,
        b int,
        c int,
    );
    には3つの

    キー
  • a、b、c があります

と同様の結合クエリを大量に実行する必要がある場合、[a, b]を含むジョイントインデックスを作成する必要がある場合があります、c]、および個別の [a][b] [c] インデックス付けだけでは十分ではありません。 (インデックスは

sort

されたリストと考えることができます) (a, b, c) のインデックスを作成することは、a、b、c で​​並べ替えることと同じです (並べ替えルールはそれぞれ

  if(X.a>Y.a)
    return '>';
  else if(X.a<Y.a)
    return &#39;<&#39;;
   else if(X.b>Y.b)
    return &#39;>&#39;;
   else if (X.b<Y.b)
    return &#39;<&#39;;
   else if (X.c>Y.c)
    return  &#39;>&#39;
   else if (X.c<Y.c)
    return  &#39;<&#39;
   esle
    return &#39;==&#39;
)
select * from test where a=10, b>50, c>20 です)。それぞれ b でソートします) c でソートするのは異なります
a b c の順序も重要で、場合によっては a c b、b c a などになることがあります。 (a, b, c) の結合インデックスを作成する場合、クエリ効率は次のとおりです:
  优: select * from test where a=10 and b>50
  差: select * from test where a>50

  优: select * from test order by a
  差: select * from test order by b
  差: select * from test order by c

  优: select * from test where a=10 order by a
  优: select * from test where a=10 order by b
  差: select * from test where a=10 order by c

  优: select * from test where a>10 order by a
  差: select * from test where a>10 order by b
  差: select * from test where a>10 order by c

  优: select * from test where a=10 and b=10 order by a
  优: select * from test where a=10 and b=10 order by b
  优: select * from test where a=10 and b=10 order by c

  优: select * from test where a=10 and b=10 order by a
  优: select * from test where a=10 and b>10 order by b
  差: select * from test where a=10 and b>10 order by c
以下を図で表します


3つの注意事項

mysqlでカラムがvarchar型の場合、アクセスにint型を使用しないでください

以下のようにzz_dealsテーブルproduct_id は varchar 型です

mysql> explain select * from zz_deals where  qq_shop_id = 64230 and product_id = &#39;38605906667&#39; ;+----+-------------+-------------+------+------------------------------+------------------------------+---------+-------------+------+-------------+| id | select_type | table       | type | possible_keys                | key                          | key_len | ref         | rows | Extra       |+----+-------------+-------------+------+------------------------------+------------------------------+---------+-------------+------+-------------+|  1 | SIMPLE      | zz_deals | ref  | by_product_id_and_qq_shop_id | by_product_id_and_qq_shop_id | 156     | const,const |    1 | Using where |+----+-------------+-------------+------+------------------------------+------------------------------+---------+-------------+------+-------------+1 row in set (0.00 sec)
mysql> explain select * from zz_deals where  qq_shop_id = 64230 and product_id = 38605906667 ;+----+-------------+-------------+------+------------------------------+------+---------+------+------+-------------+| id | select_type | table       | type | possible_keys                | key  | key_len | ref  | rows | Extra       |+----+-------------+-------------+------+------------------------------+------+---------+------+------+-------------+|  1 | SIMPLE      | zz_deals | ALL  | by_product_id_and_qq_shop_id | NULL | NULL    | NULL |   17 | Using where |+----+-------------+-------------+------+------------------------------+------+---------+------+------+-------------+1 row in set (0.00 sec)

プロモーション スローガン

2 か月半の準備、3 回の大幅な改訂、および 17 回のマイナー改訂を経て、le1024 はついに皆様にお会いできる準備が整いました

le1024 では 1 ~ 3 本のビデオを推奨しています。毎日、楽しい、愛、そして物語を。

3. データベース設計について

以上がmysql ユニオンインデックスの利点は何ですか? ジョイントインデックスの意味の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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