powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Не работает индекс по полю timestamp
13 сообщений из 13, страница 1 из 1
Не работает индекс по полю timestamp
    #39620088
petr12345
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть такая таблица. В таблице порядка 1 300 000 запсией.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE TABLE IF NOT EXISTS `user_etokens` (
  `id` bigint(14) NOT NULL,
  `user_id` bigint(14) NOT NULL,
  `email` varchar(255) NOT NULL,
  `code` int(10) NOT NULL,
  `etoken` char(64) NOT NULL,
  `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `user_id` (`user_id`),
  KEY `etoken` (`etoken`),
  KEY `created` (`created`),
  KEY `email` (`email`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;



Недавно обнаружил что такой запрос, не использует индекс
Код: sql
1.
2.
3.
4.
5.
6.
7.
MariaDB [dating]> explain SELECT * FROM `user_etokens` WHERE `created` < DATE_SUB(NOW() , INTERVAL 1 MONTH);
+------+-------------+--------------+------+---------------+------+---------+------+---------+-------------+
| id   | select_type | table        | type | possible_keys | key  | key_len | ref  | rows    | Extra       |
+------+-------------+--------------+------+---------------+------+---------+------+---------+-------------+
|    1 | SIMPLE      | user_etokens | ALL  | created       | NULL | NULL    | NULL | 1253259 | Using where |
+------+-------------+--------------+------+---------------+------+---------+------+---------+-------------+
1 row in set (0.00 sec)



Исполльзование FORCE KEY (created) не сильно помогает. Выборка заняла около 4 сек.

Подскажите, куда копать, что почитать ?
...
Рейтинг: 0 / 0
Не работает индекс по полю timestamp
    #39620095
Дормедонт Евлампиевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А много ли записей возвращает запрос? Возможно оптимизатор считает, что быстрее сделать фулскан, нежели искать-сопостовлять по индексу..
...
Рейтинг: 0 / 0
Не работает индекс по полю timestamp
    #39620195
petr12345
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
по разному... от 0 до 80 000
...
Рейтинг: 0 / 0
Не работает индекс по полю timestamp
    #39620216
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petr12345по разному... от 0 до 80 000Как это на одних данных у одного запроса может быть разный результат?
...
Рейтинг: 0 / 0
Не работает индекс по полю timestamp
    #39620248
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftpetr12345по разному... от 0 до 80 000Как это на одних данных у одного запроса может быть разный результат?Чисто гипотетически - вполне может, оно от момента времени зависит, в условие условие отбора входит текущая дата NOW().
...
Рейтинг: 0 / 0
Не работает индекс по полю timestamp
    #39620291
petr12345
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vkle , да Вы верно говорите : в зависимости от даты создания, в разные моменты выборок - разные результаты
...
Рейтинг: 0 / 0
Не работает индекс по полю timestamp
    #39620297
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petr12345 , чисто в порядке эксперимента увеличьте количество старых записей в таблице раза в три (отодвинув их ещё в прошлое лет на 15) и на всякий случай пересчитайте статистику.
...
Рейтинг: 0 / 0
Не работает индекс по полю timestamp
    #39620326
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petr12345, не смотрели, план запроса одинаковый получается и для нулевого и для большого количества записей?
...
Рейтинг: 0 / 0
Не работает индекс по полю timestamp
    #39620394
petr12345
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vkle, да. План одинаковый, независимо от количества результатов
...
Рейтинг: 0 / 0
Не работает индекс по полю timestamp
    #39620727
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, так то можно попробовать явно USE INDEX указать, вдруг, получится.
Меня вот что смущает немного.
Код: sql
1.
`created` < DATE_SUB(NOW() , INTERVAL 1 MONTH)


Слева поле типа TIMESTAMP, справа функция, возвращающая дату. Почему не оперировать одинаковым типом данных?
Ну и другой вопрос, будет ли DATE_SUB() в условии работать для каждой строки, или же значение функции будет внутри закешировано при выполнении запроса. Мне кажется, должно для каждой строки работать.
Для проверки попробуйте в условии задать явное значение цифрами.
...
Рейтинг: 0 / 0
Не работает индекс по полю timestamp
    #39620762
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vklemiksoftпропущено...
Как это на одних данных у одного запроса может быть разный результат?Чисто гипотетически - вполне может, оно от момента времени зависит, в условие условие отбора входит текущая дата NOW().Да, согласен.
vkleСлева поле типа TIMESTAMP, справа функция, возвращающая дату. Почему не оперировать одинаковым типом данных?Да, правую половину хорошо бы явно привести к типу TIMESTAMP. MySQL иногда ошибается и не ту сторону выражения приводит к другой.

Я бы еще предложил сделать OPTIMIZE TABLE.
...
Рейтинг: 0 / 0
Не работает индекс по полю timestamp
    #39621301
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petr12345
Код: sql
1.
2.
3.
4.
5.
6.
7.
MariaDB [dating]> explain SELECT * FROM `user_etokens` WHERE `created` < DATE_SUB(NOW() , INTERVAL 1 MONTH);
+------+-------------+--------------+------+---------------+------+---------+------+---------+-------------+
| id   | select_type | table        | type | possible_keys | key  | key_len | ref  | rows    | Extra       |
+------+-------------+--------------+------+---------------+------+---------+------+---------+-------------+
|    1 | SIMPLE      | user_etokens | ALL  | created       | NULL | NULL    | NULL | 1253259 | Using where |
+------+-------------+--------------+------+---------------+------+---------+------+---------+-------------+
1 row in set (0.00 sec)



Исполльзование FORCE KEY (created) не сильно помогает. Выборка заняла около 4 сек.

Подскажите, куда копать, что почитать ?

Про селективность индексов почитай...
...
Рейтинг: 0 / 0
Не работает индекс по полю timestamp
    #39622403
bochkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
использование now() не самый лучший вариант
лучше значение параметра сам (на клиентской стороне) определяй
оптимизатор бывает тупит
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Не работает индекс по полю timestamp
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]