1

次のテーブルがあります:

CREATE TABLE `test` (
 `fingerprint` varchar(80) COLLATE utf8_unicode_ci NOT NULL,
 `country` varchar(5) COLLATE utf8_unicode_ci NOT NULL,
 `loader` int(10) unsigned NOT NULL,
 `date` date NOT NULL,
 `installer` int(10) unsigned DEFAULT NULL,
 `browser` varchar(5) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
 `version` varchar(5) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
 `os` varchar(10) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
 `language` varchar(10) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
 PRIMARY KEY (`fingerprint`, `date`),
 KEY `date_1` (`date`),
 KEY `date_2` (`date`,`loader`,`installer`,`country`,`browser`,`os`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

現在、10M レコードが含まれており、1 日あたり 2M レコードごとに増加します。

私の質問、MySQL が次のクエリで「Using Where」を使用する理由:

explain select count(*) from test where date between '2013-08-01' and '2013-08-10'
1   SIMPLE  test    range   date_1,date_2   date_1  3       1601644 Using where; Using index

更新、なぜ次の質問にタイプがあるのか​​ - All and Using where then:

explain select * from test use key(date_1) where date between '2013-08-01' and '2013-08-10'
1 SIMPLE test ALL date_1 null null null 3648813 Using where
4

2 に答える 2

1

インデックスを使用します

そこにはそう書かれています:Using where; Using index。「使用場所」はフルスキャンを意味するのではなく、指定したWHERE条件を使用していることを意味します。

1601644 という数値もそれを示唆しています。これは、テーブル内の 10M 全体ではなく、およそ 160 万件のレコードを読み取ることを期待していることを意味し、1 日あたり約 2M の見積もりと相関しています。

要するに、うまくいっているように見えます。取得するデータが大量にあるだけです。

それでも、インデックスで十分だと思われる場合は、テーブル データも読み取っています。count(*)with をcount(date)変更してみてくださいdate。クエリ全体で言及されている唯一のフィールドです。のみを取得する場合はUsing index、より高速になる可能性があります。

于 2013-08-07T13:30:47.573 に答える