powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / не работает индекс в условии where с полем типа datetime
25 сообщений из 25, страница 1 из 1
не работает индекс в условии where с полем типа datetime
    #38942932
meola
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет! Внутри процедуры есть запрос вида:
Код: sql
1.
SELECT * FROM таблица WHERE поле1 BETWEEN '20150101 00:00:00' AND '20150131 23:59:59'

, где поле1 типа CHAR(17), а таблица MyISAM. Вешаю на поле1 индекс, оптимизатор его скушал, запрос отработал быстро, всё пучком. Но если делаю так:
Код: sql
1.
2.
3.
4.
declare start, finish char(17);
set start = '20150101 00:00:00';
set finish = '20150131 23:59:59';
SELECT * FROM таблица WHERE поле1 BETWEEN start AND finish

,
то оптимизатор индекс не использует, пробегается по всем полям таблички. Почему?
...
Рейтинг: 0 / 0
не работает индекс в условии where с полем типа datetime
    #38942944
meola,

потому что в случае с константами оптимизатор может оценить примерный объем выборки и, если он невелик, выбирает индексный доступ. в случае же с переменными подстановки оптимизатор не в состоянии заранее на все случаи жизни оценить ширину заданного интервала и кол-во выбираемых записей, поэтому выбирает полное сканирование таблицы...
...
Рейтинг: 0 / 0
не работает индекс в условии where с полем типа datetime
    #38942945
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
meolaгде поле1 типа CHAR(17),

Вот с этого места, пожалуйста, поподробнее ...
...
Рейтинг: 0 / 0
не работает индекс в условии where с полем типа datetime
    #38942956
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
meola,

А где datetime, обещанный в заголовке?
...
Рейтинг: 0 / 0
не работает индекс в условии where с полем типа datetime
    #38942987
meola
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft, пардон, тип поля не datetime, а char(17)
...
Рейтинг: 0 / 0
не работает индекс в условии where с полем типа datetime
    #38942989
meola
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - Эхmeola,

потому что в случае с константами оптимизатор может оценить примерный объем выборки и, если он невелик, выбирает индексный доступ. в случае же с переменными подстановки оптимизатор не в состоянии заранее на все случаи жизни оценить ширину заданного интервала и кол-во выбираемых записей, поэтому выбирает полное сканирование таблицы...Понятно, спасибо! А как теперь поступить, чтобы индекс заработал?
...
Рейтинг: 0 / 0
не работает индекс в условии where с полем типа datetime
    #38942991
meola
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivmeolaгде поле1 типа CHAR(17),

Вот с этого места, пожалуйста, поподробнее ...А что собственно смущает, поле имеет тип CHAR(17), хранить строку типа 'ггггммдд чч:мм:сс'
...
Рейтинг: 0 / 0
не работает индекс в условии where с полем типа datetime
    #38942992
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
meolamiksoft, пардон, тип поля не datetime, а char(17)А почему бы на настоящий datetime не перейти? Тогда и табличка компактнее будет, и оптимизатору полегче будет на индекс решиться.
...
Рейтинг: 0 / 0
не работает индекс в условии where с полем типа datetime
    #38943008
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftmeolamiksoft, пардон, тип поля не datetime, а char(17)А почему бы на настоящий datetime не перейти? Тогда и табличка компактнее будет, и оптимизатору полегче будет на индекс решиться.

Главное -- сравнение на < будет работать правильно ..
...
Рейтинг: 0 / 0
не работает индекс в условии where с полем типа datetime
    #38943011
meola
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoftmeolamiksoft, пардон, тип поля не datetime, а char(17)А почему бы на настоящий datetime не перейти? Тогда и табличка компактнее будет, и оптимизатору полегче будет на индекс решиться. Потому что значение поля передается с контроллера, а он "умеет" передавать только числа и строки
...
Рейтинг: 0 / 0
не работает индекс в условии where с полем типа datetime
    #38943014
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivГлавное -- сравнение на < будет работать правильно ..Да, по идее, оно и сейчас будет правильно работать. Если, конечно, формат везде строго соблюден.
...
Рейтинг: 0 / 0
не работает индекс в условии where с полем типа datetime
    #38943015
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
meolamiksoftпропущено...
А почему бы на настоящий datetime не перейти? Тогда и табличка компактнее будет, и оптимизатору полегче будет на индекс решиться. Потому что значение поля передается с контроллера, а он "умеет" передавать только числа и строкиА передавать немного в другом формате он сможет?
'2015-01-01 00:00:00'
...
Рейтинг: 0 / 0
не работает индекс в условии where с полем типа datetime
    #38943016
meola
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Блин, не пойму, какая разница какого типа поле , datetime или char(17), если оно сравнивается с диапазоном аналогичного типа значений? Конкретные значения пишу в условии where - индекс работает, а если через переменные - нет, бред какой-то, первый раз с таким сталкиваюсь....
...
Рейтинг: 0 / 0
не работает индекс в условии where с полем типа datetime
    #38943021
meola
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoftmeolaпропущено...
Потому что значение поля передается с контроллера, а он "умеет" передавать только числа и строкиА передавать немного в другом формате он сможет?
'2015-01-01 00:00:00' Может
...
Рейтинг: 0 / 0
не работает индекс в условии where с полем типа datetime
    #38943037
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
meolamiksoftпропущено...
А передавать немного в другом формате он сможет?
'2015-01-01 00:00:00' МожетТогда вполне можно и поле на datetime сменить. В MySQL литералы даты-времени пишутся именно в таком формате.
...
Рейтинг: 0 / 0
не работает индекс в условии where с полем типа datetime
    #38943038
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
meolaКонкретные значения пишу в условии where - индекс работает, а если через переменные - нет, бред какой-то, первый раз с таким сталкиваюсь....Можете привести планы обоих вариантов запросов?
...
Рейтинг: 0 / 0
не работает индекс в условии where с полем типа datetime
    #38943042
meola
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoftmeolaКонкретные значения пишу в условии where - индекс работает, а если через переменные - нет, бред какой-то, первый раз с таким сталкиваюсь....Можете привести планы обоих вариантов запросов?Как только буду на работе, приведу обязательно....Но всё же скажите, вот если в качестве строки будет не дататайм, а просто строка, то как в такой ситуации заставить работать оптимизатор по индексу по этому полю?
...
Рейтинг: 0 / 0
не работает индекс в условии where с полем типа datetime
    #38943045
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
meolaкак в такой ситуации заставить работать оптимизатор по индексу по этому полю?Можно гвоздями прибить...
...
Рейтинг: 0 / 0
не работает индекс в условии where с полем типа datetime
    #38943068
meola
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoftmeolaкак в такой ситуации заставить работать оптимизатор по индексу по этому полю?Можно гвоздями прибить...Тоже не прокатило, указывал FORCE INDEX(индекс_на_поле) , нифига, оптимизатор бежит по всеё таблице хоть ты тресни...
...
Рейтинг: 0 / 0
не работает индекс в условии where с полем типа datetime
    #38943127
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
meolaДобрый Э - Эхmeola,

потому что в случае с константами оптимизатор может оценить примерный объем выборки и, если он невелик, выбирает индексный доступ. в случае же с переменными подстановки оптимизатор не в состоянии заранее на все случаи жизни оценить ширину заданного интервала и кол-во выбираемых записей, поэтому выбирает полное сканирование таблицы...Понятно, спасибо! А как теперь поступить, чтобы индекс заработал?


Использовать хинт оптимизатору для индекса.
...
Рейтинг: 0 / 0
не работает индекс в условии where с полем типа datetime
    #38943128
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
meolamiksoftпропущено...
Можно гвоздями прибить...Тоже не прокатило, указывал FORCE INDEX(индекс_на_поле) , нифига, оптимизатор бежит по всеё таблице хоть ты тресни...

давай тогда полностью определение таблицы и индексов, запрос и план.
без изменений, один в один как выполняется.
...
Рейтинг: 0 / 0
не работает индекс в условии where с полем типа datetime
    #38943885
meola
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Блин, полдня мускул насиловал и в конце концов он сдался)). Вообще-м решение такое: изменил set на select и оптимизатор тут же подхватил индекс на поле в условии where, почему-то для мускула это принципиально, какие есть предположения на этот счет?
...
Рейтинг: 0 / 0
не работает индекс в условии where с полем типа datetime
    #38943890
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
meolaизменил set на select Это как?

планов, кстати, мы так и не увидели...
...
Рейтинг: 0 / 0
не работает индекс в условии where с полем типа datetime
    #38943893
meola
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoftmeolaизменил set на select Это как?

планов, кстати, мы так и не увидели...Вот так:
Код: sql
1.
2.
SELECT '20150101 00:00:00' into start;
SELECT '20150131 23:59:59' into finish;
...
Рейтинг: 0 / 0
не работает индекс в условии where с полем типа datetime
    #38943903
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
meola,

Ага, понял.

Пока единственная гипотеза, которая у меня есть - что-то не так с типами переменных. И не всегда правильно оптимизатор выбирает направление приведения типов. Когда поле1 приводится к типу переменных - индекс, конечно, использоваться не может (и даже хинт не поможет). А вот когда переменные приводятся к типу поля поле1 или приведение не происходит вовсе - тогда индекс использоваться должен.
Но в эту гипотезу не укладывается стартовый пост топика. Тут, чтобы разобраться до конца, все-таки нужны полные данные.
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / не работает индекс в условии where с полем типа datetime
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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