2014-10-08 5 views
0

У меня есть ниже схемыПочему индекс, определенный в таблице, не используется оптимизатором запросов? (MySQL)

CREATE TABLE `test` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `d` date NOT NULL, 
    `y` year(4) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `y` (`y`) 
) ENGINE=MyISAM CHARSET=utf8; 

, когда я запускаю "EXPLAIN SELECT * FROM тест, где у = '2010';"

Несмотря на то, что указатель, определенный в таблице для столбца «y», не используется оптимизатором запросов.

В чем может быть причина?

+0

Сколько строк в таблице? MySQL не обязан использовать индекс только потому, что он доступен. –

+0

Мои ряды - 70 000 –

+0

что? год встроен в MYSQL, проверьте эту ссылку http://dev.mysql.com/doc/refman/5.0/en/year.html –

ответ

1

MySQL должен найти, что стоит использовать индекс.

Обычно это случай, когда dbms ожидает найти всего несколько записей. Даже что-то менее 10% или даже 5% всех записей можно рассматривать как слишком много, и dbms решает тогда лучше сканировать всю таблицу вместо того, чтобы путаться через индекс.

Так что ответ: MySQL не считает нужным использовать здесь индекс. Он считает, что полное сканирование таблицы, вероятно, быстрее.

+0

Спасибо за ваш ответ, но как Mysql уместно, что мой вопрос в том, что, потому что я говорю в схеме, что хочу иметь год в качестве ключа и использовать это на том, где близко, поэтому кажется, что Mysql должен использовать и индексировать. –

+1

У вас в вашей таблице 70000 записей. Это немного и можно очень быстро прочитать. С другой стороны, использование индекса может быть очень медленным. Сколько разных лет в вашем столе? Если будет 70000 различных лет, я определенно скажу, что использую индекс. Через 10000 лет я все равно буду использовать индекс. Но, к примеру, всего 100 лет, я бы предположил, что полное сканирование таблицы быстрее для того, чтобы быть намного проще. –

+0

SELECT DISTINCT y FROM test; + ------ + | год | + ------ + | 2008 | | 2009 | | 2010 | | 2011 | | 2012 | | 2013 | | 2014 | + ------ + –