[MySQL, solved] Почему-то не используется индекс
Не скажу, как конкретно в мускуле, но обычно такое возникает, когда CBO по каким-то причинам решает, что прочитать всю таблицу проще
Если у тебя в таблице около 8к записей, то в результат по твоему условию попадут почти все. Индекс же дает существенный прирост производительности, когда мы выбираем не более 10% от всех записей. Логично, что СУБД решает не использовать его, а использовать sequential scan - это быстрее
По поводу вот этого
При выборке только id их можно целиком выбрать по индексу, не прибегая к чтению самих записей с диска
По поводу вот этого
Но почему-то соглашается использовать ключ, если выбираю только одно поле id, без поля ionic.
При выборке только id их можно целиком выбрать по индексу, не прибегая к чтению самих записей с диска
USE KEY (PRIMARY) - это всего лишь рекомендация.
Чтобы форсировать использование, надо писать FORCE KEY (PRIMARY).
Если с ключом правда лучше, то можно попробовать еще analyze table, оно пересчитает распределение ключей в индексе, и оптимизатор запросов может изменить свое мнение о том, надо использовать индекс или нет.
Впрочем, если в базе 15829 строк, и хочется выбрать из них все, кроме первых 100, то mysql прав, в таком запросе индекс только помешает.
Чтобы форсировать использование, надо писать FORCE KEY (PRIMARY).
Если с ключом правда лучше, то можно попробовать еще analyze table, оно пересчитает распределение ключей в индексе, и оптимизатор запросов может изменить свое мнение о том, надо использовать индекс или нет.
Впрочем, если в базе 15829 строк, и хочется выбрать из них все, кроме первых 100, то mysql прав, в таком запросе индекс только помешает.
Оказалось, действительно анализатор мускуля сбрендил. Изначальная проблема возникла собственно из-за неиспользования мускулем индекса при джоине таблицы самой с собой по индексированному полю. Optimize table и repair table пробовал, а про analyze table забыл. Именно он и помог 

Оставить комментарий
doublemother
Когда делаю селект:
Если явно указать USE KEY (PRIMARY ключ всё равно не используется. Попробовал создать индекс по полю weight и в where вместо id наложить условие weight>0 - ключ всё равно не используется. Но почему-то соглашается использовать ключ, если выбираю только одно поле id, без поля ionic.
Кто-нибудь знает, почему так может происходить? Версия мускуля 5.0.51a-3 (Debian).