Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Не работает индекс по полю timestamp / 13 сообщений из 13, страница 1 из 1
25.03.2018, 11:06
    #39620088
petr12345
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает индекс по полю timestamp
Есть такая таблица. В таблице порядка 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
25.03.2018, 11:34
    #39620095
Дормедонт Евлампиевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает индекс по полю timestamp
А много ли записей возвращает запрос? Возможно оптимизатор считает, что быстрее сделать фулскан, нежели искать-сопостовлять по индексу..
...
Рейтинг: 0 / 0
25.03.2018, 19:54
    #39620195
petr12345
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает индекс по полю timestamp
по разному... от 0 до 80 000
...
Рейтинг: 0 / 0
25.03.2018, 21:54
    #39620216
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает индекс по полю timestamp
petr12345по разному... от 0 до 80 000Как это на одних данных у одного запроса может быть разный результат?
...
Рейтинг: 0 / 0
26.03.2018, 00:02
    #39620248
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает индекс по полю timestamp
miksoftpetr12345по разному... от 0 до 80 000Как это на одних данных у одного запроса может быть разный результат?Чисто гипотетически - вполне может, оно от момента времени зависит, в условие условие отбора входит текущая дата NOW().
...
Рейтинг: 0 / 0
26.03.2018, 07:09
    #39620291
petr12345
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает индекс по полю timestamp
vkle , да Вы верно говорите : в зависимости от даты создания, в разные моменты выборок - разные результаты
...
Рейтинг: 0 / 0
26.03.2018, 07:49
    #39620297
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает индекс по полю timestamp
petr12345 , чисто в порядке эксперимента увеличьте количество старых записей в таблице раза в три (отодвинув их ещё в прошлое лет на 15) и на всякий случай пересчитайте статистику.
...
Рейтинг: 0 / 0
26.03.2018, 09:26
    #39620326
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает индекс по полю timestamp
petr12345, не смотрели, план запроса одинаковый получается и для нулевого и для большого количества записей?
...
Рейтинг: 0 / 0
26.03.2018, 11:08
    #39620394
petr12345
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает индекс по полю timestamp
vkle, да. План одинаковый, независимо от количества результатов
...
Рейтинг: 0 / 0
26.03.2018, 19:53
    #39620727
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает индекс по полю timestamp
Ну, так то можно попробовать явно USE INDEX указать, вдруг, получится.
Меня вот что смущает немного.
Код: sql
1.
`created` < DATE_SUB(NOW() , INTERVAL 1 MONTH)


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

Я бы еще предложил сделать OPTIMIZE TABLE.
...
Рейтинг: 0 / 0
27.03.2018, 16:01
    #39621301
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает индекс по полю timestamp
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
29.03.2018, 05:39
    #39622403
bochkov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает индекс по полю timestamp
использование now() не самый лучший вариант
лучше значение параметра сам (на клиентской стороне) определяй
оптимизатор бывает тупит
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Не работает индекс по полю timestamp / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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