Задать вопрос
fast-je
@fast-je
Пишу на php.

Как заставить работать индекс при запросе?

Всем привет!
Есть таблица в которой есть поле date и там INT и оно index.
Но при EXPLAIN показывает что index не используется.
Я подумал, ну наверное проблема с типами и сделал convert to SIGNED UNIX_TIMESTAMP(), но что-то не особо помогает, что-то делают я не так.

5e6c054963695311726749.png

Еще у меня было так
SELECT * FROM `still_youtube_ads_user` WHERE `date`+12313123 < CONVERT(UNIX_TIMESTAMP(), SIGNED)


Не уверен что с + будет работать.
Как заставить работать индекс ?
  • Вопрос задан
  • 303 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 1
fast-je
@fast-je Автор вопроса
Пишу на php.
Rsa97, Спасибо за ответ, вы очень помогли.

Ответ.
Разница в том, что по полю `date` индекс у вас есть, а по выражению `date`+23328000 индекса нет и быть не может.

Чаще всего MySQL не ошибается.
В вашем случае ожидается, что под условие `date` < CONVERT(UNIX_TIMESTAMP(), SIGNED) попадёт 50% строк, а значит проще перебрать все строки, чем читать в одном месте индекс, в другом строки, на которые он ссылается.

Индекс работает когда:
1. В левой части условия находится чистое поле, а не выражение или функция от поля.
2. Есть подходящий индекс. Если условий несколько, то может использоваться составной индекс, имеющий подходящий префикс.
3. MySQL считает, что использование индекса затратит меньше ресурсов, чем прямое сканирование.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
https://dev.mysql.com/doc/refman/8.0/en/index-hint...
В вашел случае это не поможет так как выборка не маленькая указывайте меньшими ренжами , ни кто в здравом уме не выбирает пол милиона записей

mysql в вашем запросе выборку с индексом прировнял к полному сканированию таблицы
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы