7

次のテーブル構造があります

CREATE TABLE `table` (
  `id` int(11) NOT NULL auto_increment,
  `date_expired` datetime NOT NULL,
  `user_id` int(11) NOT NULL,
  `foreign_id` int(11) NOT NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `date_expired` (`date_expired`,`user_id`,`foreign_id`),
  KEY `user_id` (`user_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

お気づきのとおり、 user_id: date_expired&に重複したインデックスがありますuser_id。もちろん、データが一意であることを確認したいので、一意のインデックスが必要です。

インデックスが重複する理由は、インデックスがないuser_idと、メインの検索クエリに 4 秒かかるためです。追加のインデックスを使用すると、1 秒かかります。クエリは でテーブルを結合しuser_id、チェックしていdate_expiredます。

テーブルには 275 レコードしかありません。

  • 同じフィールドに一意のインデックスと通常のインデックスを持つことはどれほど悪いことですか?
  • テーブルが純粋に ID である場合、データよりも大きなインデックスを持つことはどれほど悪いことでしょうか?
4

3 に答える 3

9

一意のインデックスを(、、、)として作成した場合user_iddate_expired一意のインデックスだけforeign_idで通常のインデックスを使用するのと同じメリットが得られると思いますuser_id。MySQLは、任意のインデックスの最初の列を使用して、のインデックスと同じ方法で結合の行数を減らすことができますuser_id

詳細については、 MySQLのインデックスドキュメントを参照してください。

idスペースを節約するために、スキーマの他の場所でauto_increment列を参照していますか?一意のインデックスはテーブル内の他のすべての列をカバーするため、本質的には主キー自体であり、そうでない場合は削除される可能性があります。

EXPLAINをプレフィックスとして付けることで、クエリが使用しているキーを確認できます。

于 2008-11-15T06:50:06.297 に答える
3

インデックスの重複とはどういう意味かわかりません。テーブルには3つのインデックスがあります。

  1. 主キー「id」用の1つ(これは一意を意味します)
  2. 'date_expired'、'user_id'、および'foreign_id'の組み合わせのためのもう1つのユニークなもの
  3. そして3つ目は'user_id'のみ

したがって、重複はありません。異なることを行う3つの異なるインデックスがあります。表示されているuser_idに関連するクエリを高速化するには、3番目が必要です。したがって、この特定のテーブルには何も問題はありません。何も複製していません。2番目の質問に関しては、ニーズによって異なりますが、データよりもインデックスで多くのスペースを使用することは確かに悪いことではありません。

たとえば、悪いのは、一方のインデックスにもう一方のインデックスが含まれ、何もないため、UNIQUE('user_id')と後でKEY('user_id')(MySQLがそれを許可するかどうかさえわかりません)を持つことです。得るために。

于 2008-11-15T06:39:18.923 に答える
1

1つのフィールドを含む複数のインデックスを持つことはまったく悪いことではありません(基本的に、それらは異なるものにインデックスを付けます)。書き込みパフォーマンスにわずかな影響がありますが、これは、すべてのインデックスを最初に使用する場合の一般的なトレードオフです。スペースが安い場合、インデックスがデータ自体よりも多くのスペースを消費することは悪くありません。あなたの場合、エントリの数が非常に少ないという事実を考えると、それは安いはずです。

私があなたの立場で尋ねる質問は、このような小さなテーブルのインデックス作成は、クエリの実行時間にどのように深刻な影響を与えるのでしょうか。おそらくあなたは何か間違ったことをしているでしょう(私はこのテーブルへの冗長なクエリがたくさんあると思います)、単一のクエリはこの少数のエントリでこの時間範囲に近くないはずです)。

于 2008-11-15T06:37:54.903 に答える