2013-08-07 5 views
1

У меня есть следующая таблица:Mysql не использует индекс над огромным столом

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 запись и будет увеличиваться за 2M записей/день.

Мой вопрос, почему MySQL использовать "Использование Где" на следующий запрос:

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 

Update, почему следующий вопрос имеют тип - все и с помощью которых затем:

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 
+0

Просто комментарий, вам не нужен индекс date_1, индекс даты_2 охватывает ту же функциональность – PerroVerd

+0

да, я знаю, я добавляю date_1, чтобы не получить ответы - используйте 1 индекс столбца –

+1

возможный дубликат [mysql fix Использование where ;] (http://stackoverflow.com/questions/9533841/mysql-fix-using-where) –

ответ

1

Это делает используйте индекс.

Здесь говорится: Using where; Using index. «Использование где» не означает полного сканирования, это означает, что он использует условие, которое вы предоставили.

Номер 1601644 также указывает на то, что он предполагает, что он будет читать примерно 1,6 М записи, а не весь 10 М в таблице, и это соотносится с оценкой ~ 2М/день.

Короче говоря, похоже, что все хорошо, это всего лишь много данных, которые вы получите.

По-прежнему, он также считывает данные таблицы, когда кажется, что индекса должно быть достаточно. Попробуйте изменить count(*) на count(date), так что date - единственное поле, упомянутое в целом запросе. Если вы получите только Using index, то это может быть быстрее.

+0

Фактически «Использование индекса» не означает, что он использует его для поиска строк (он также появляется при полном сканировании индекса). type = range означает, что он использует индекс для поиска совпадающих строк. – Vatev

0

Ваш запрос - это не просто «Использование где», это на самом деле «Использование где, используя индекс». Это означает, что индекс используется для соответствия вашему WHERE условиям и этот индекс используется для выполнения поиска значений ключа. Это лучший сценарий, потому что на самом деле таблица никогда не была отсканирована, запрос может обрабатываться только с индексом.

Here you can find полное описание значения результата, на который вы смотрите.


В вашем втором запросе отображается уведомление «Использование где». Это означает, что индекс используется только для фильтрации строк. Данные должны быть прочитаны из таблицы (нет уведомления «Использование индекса»), поскольку индекс не содержит всех данных строки (вы выбрали все столбцы, но выбранный индекс охватывает только date). Если бы у вас был индекс покрытия (который охватывает все столбцы), этот индекс, вероятно, будет использоваться вместо этого.