0

私は3000万のレコードを持っており、1つのフィールド(更新)はインデックス付きのtinyint(1)です。

私が実行した場合:

SELECT * FROM  `table` WHERE `updated` = 1

1に設定されている数によっては、ますます長い時間がかかります。10,000と言えば、約1秒とかなり速くなります。ただし、100万と言うと、数分かかります。

インデックスはこれを速くすることを想定していませんか?

int(1)のみが類似しているインデックスなしフィールドで同じクエリを実行すると、インデックス付きフィールドと同じように実行されます。

なぜこれになるのかについてのアイデアはありますか?tinyintは悪いですか?

4

1 に答える 1

1

一般に、インデックスにバイナリ列を使用することはお勧めできません。大丈夫な場合もありますが、これは一般的に疑わしいです。

インデックスの主な目的は、クエリの I/O を減らすことです。クエリの表現方法では、元のデータ (「select *」を満たすため) とインデックス (where 句用) の両方が必要です。

したがって、データベース エンジンはインデックスを通過します。一致するレコードが見つかるたびに、ページをメンバーに取り込みます。I/O ヒットがあります。テーブルが非常に大きいため、ページがまだ表示されていない可能性があり、実際の I/O ヒットがあります。

興味深いことに、あなたの経験がこれを裏付けています。10,000 行は約 1 秒です。行数の 100 倍 (100 万) は約 100 秒です。パフォーマンスの直線性を目の当たりにしています。

ちなみに、「select *」の代わりに「select update」を実行すると、クエリが高速になります。このクエリは、インデックスからのみ満たすことができます。id 列がある場合は、(update, id) にインデックスを作成し、パフォーマンスのために「select id」を実行できます。

于 2012-08-17T01:29:25.643 に答える