2014-08-27 5 views
0

У меня проблема с таблицей. Используется составной первичный ключ. Ключ состоит из даты, за которой следует bigint.Проблема с базовым ключом MySQL Compound

Выбирает на столе, как сканирование, даже если вы выбираете поля из PK и используете предложение where, содержащее оба столбца. Для примера

SELECT mydate, myid from foo WHERE mydate >='2014-08-26' AND my_id = 1234; 

Объяснение выбора показывает, где и сколько строк указано в миллионах.

Одна странность - key_len, которая показана как 7, которая кажется слишком маленькой.

Мой инстинкт говорит, что ключ сломан, но я могу пропустить что-то очевидное.

Любые мысли?

Спасибо

Ричард

+0

MySQL 5.5 на кластере percona. –

+1

Пожалуйста, опубликуйте результат 'show create table foo;' и 'explain select ...'; – fancyPants

ответ

1

Для этого запроса индекс вы хотите на id, date:

create index idx_foo_myid_mydate on foo(my_id, mydate); 

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

MySQL documentation действительно делает хорошую работу (по-моему) в объяснении составных индексов.

Ваш существующий индекс будет использоваться для неравенства на mydate. Тем не менее, весь индекс после указанной даты будет сканироваться, чтобы удовлетворять условию на my_id. С правильным индексом MySQL может просто перейти к правильным строкам напрямую.

+0

Благодарим вас за добавление и индексирование до 66M строк :) –