|
|
|
не работает индекс в условии where с полем типа datetime
|
|||
|---|---|---|---|
|
#18+
Всем привет! Внутри процедуры есть запрос вида: Код: sql 1. , где поле1 типа CHAR(17), а таблица MyISAM. Вешаю на поле1 индекс, оптимизатор его скушал, запрос отработал быстро, всё пучком. Но если делаю так: Код: sql 1. 2. 3. 4. , то оптимизатор индекс не использует, пробегается по всем полям таблички. Почему? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2015, 19:20:59 |
|
||
|
не работает индекс в условии where с полем типа datetime
|
|||
|---|---|---|---|
|
#18+
meola, потому что в случае с константами оптимизатор может оценить примерный объем выборки и, если он невелик, выбирает индексный доступ. в случае же с переменными подстановки оптимизатор не в состоянии заранее на все случаи жизни оценить ширину заданного интервала и кол-во выбираемых записей, поэтому выбирает полное сканирование таблицы... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2015, 19:43:02 |
|
||
|
не работает индекс в условии where с полем типа datetime
|
|||
|---|---|---|---|
|
#18+
meolaгде поле1 типа CHAR(17), Вот с этого места, пожалуйста, поподробнее ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2015, 19:45:03 |
|
||
|
не работает индекс в условии where с полем типа datetime
|
|||
|---|---|---|---|
|
#18+
meola, А где datetime, обещанный в заголовке? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2015, 20:00:22 |
|
||
|
не работает индекс в условии where с полем типа datetime
|
|||
|---|---|---|---|
|
#18+
miksoft, пардон, тип поля не datetime, а char(17) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2015, 20:29:45 |
|
||
|
не работает индекс в условии where с полем типа datetime
|
|||
|---|---|---|---|
|
#18+
Добрый Э - Эхmeola, потому что в случае с константами оптимизатор может оценить примерный объем выборки и, если он невелик, выбирает индексный доступ. в случае же с переменными подстановки оптимизатор не в состоянии заранее на все случаи жизни оценить ширину заданного интервала и кол-во выбираемых записей, поэтому выбирает полное сканирование таблицы...Понятно, спасибо! А как теперь поступить, чтобы индекс заработал? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2015, 20:30:55 |
|
||
|
не работает индекс в условии where с полем типа datetime
|
|||
|---|---|---|---|
|
#18+
MasterZivmeolaгде поле1 типа CHAR(17), Вот с этого места, пожалуйста, поподробнее ...А что собственно смущает, поле имеет тип CHAR(17), хранить строку типа 'ггггммдд чч:мм:сс' ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2015, 20:33:06 |
|
||
|
не работает индекс в условии where с полем типа datetime
|
|||
|---|---|---|---|
|
#18+
meolamiksoft, пардон, тип поля не datetime, а char(17)А почему бы на настоящий datetime не перейти? Тогда и табличка компактнее будет, и оптимизатору полегче будет на индекс решиться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2015, 20:35:24 |
|
||
|
не работает индекс в условии where с полем типа datetime
|
|||
|---|---|---|---|
|
#18+
miksoftmeolamiksoft, пардон, тип поля не datetime, а char(17)А почему бы на настоящий datetime не перейти? Тогда и табличка компактнее будет, и оптимизатору полегче будет на индекс решиться. Главное -- сравнение на < будет работать правильно .. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2015, 20:58:03 |
|
||
|
не работает индекс в условии where с полем типа datetime
|
|||
|---|---|---|---|
|
#18+
miksoftmeolamiksoft, пардон, тип поля не datetime, а char(17)А почему бы на настоящий datetime не перейти? Тогда и табличка компактнее будет, и оптимизатору полегче будет на индекс решиться. Потому что значение поля передается с контроллера, а он "умеет" передавать только числа и строки ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2015, 20:59:41 |
|
||
|
не работает индекс в условии where с полем типа datetime
|
|||
|---|---|---|---|
|
#18+
MasterZivГлавное -- сравнение на < будет работать правильно ..Да, по идее, оно и сейчас будет правильно работать. Если, конечно, формат везде строго соблюден. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2015, 21:01:16 |
|
||
|
не работает индекс в условии where с полем типа datetime
|
|||
|---|---|---|---|
|
#18+
meolamiksoftпропущено... А почему бы на настоящий datetime не перейти? Тогда и табличка компактнее будет, и оптимизатору полегче будет на индекс решиться. Потому что значение поля передается с контроллера, а он "умеет" передавать только числа и строкиА передавать немного в другом формате он сможет? '2015-01-01 00:00:00' ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2015, 21:02:41 |
|
||
|
не работает индекс в условии where с полем типа datetime
|
|||
|---|---|---|---|
|
#18+
Блин, не пойму, какая разница какого типа поле , datetime или char(17), если оно сравнивается с диапазоном аналогичного типа значений? Конкретные значения пишу в условии where - индекс работает, а если через переменные - нет, бред какой-то, первый раз с таким сталкиваюсь.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2015, 21:05:21 |
|
||
|
не работает индекс в условии where с полем типа datetime
|
|||
|---|---|---|---|
|
#18+
miksoftmeolaпропущено... Потому что значение поля передается с контроллера, а он "умеет" передавать только числа и строкиА передавать немного в другом формате он сможет? '2015-01-01 00:00:00' Может ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2015, 21:12:30 |
|
||
|
не работает индекс в условии where с полем типа datetime
|
|||
|---|---|---|---|
|
#18+
meolamiksoftпропущено... А передавать немного в другом формате он сможет? '2015-01-01 00:00:00' МожетТогда вполне можно и поле на datetime сменить. В MySQL литералы даты-времени пишутся именно в таком формате. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2015, 21:37:55 |
|
||
|
не работает индекс в условии where с полем типа datetime
|
|||
|---|---|---|---|
|
#18+
meolaКонкретные значения пишу в условии where - индекс работает, а если через переменные - нет, бред какой-то, первый раз с таким сталкиваюсь....Можете привести планы обоих вариантов запросов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2015, 21:39:07 |
|
||
|
не работает индекс в условии where с полем типа datetime
|
|||
|---|---|---|---|
|
#18+
miksoftmeolaКонкретные значения пишу в условии where - индекс работает, а если через переменные - нет, бред какой-то, первый раз с таким сталкиваюсь....Можете привести планы обоих вариантов запросов?Как только буду на работе, приведу обязательно....Но всё же скажите, вот если в качестве строки будет не дататайм, а просто строка, то как в такой ситуации заставить работать оптимизатор по индексу по этому полю? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2015, 21:46:21 |
|
||
|
не работает индекс в условии where с полем типа datetime
|
|||
|---|---|---|---|
|
#18+
meolaкак в такой ситуации заставить работать оптимизатор по индексу по этому полю?Можно гвоздями прибить... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2015, 21:51:29 |
|
||
|
не работает индекс в условии where с полем типа datetime
|
|||
|---|---|---|---|
|
#18+
miksoftmeolaкак в такой ситуации заставить работать оптимизатор по индексу по этому полю?Можно гвоздями прибить...Тоже не прокатило, указывал FORCE INDEX(индекс_на_поле) , нифига, оптимизатор бежит по всеё таблице хоть ты тресни... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2015, 22:48:29 |
|
||
|
не работает индекс в условии where с полем типа datetime
|
|||
|---|---|---|---|
|
#18+
meolaДобрый Э - Эхmeola, потому что в случае с константами оптимизатор может оценить примерный объем выборки и, если он невелик, выбирает индексный доступ. в случае же с переменными подстановки оптимизатор не в состоянии заранее на все случаи жизни оценить ширину заданного интервала и кол-во выбираемых записей, поэтому выбирает полное сканирование таблицы...Понятно, спасибо! А как теперь поступить, чтобы индекс заработал? Использовать хинт оптимизатору для индекса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 07:30:20 |
|
||
|
не работает индекс в условии where с полем типа datetime
|
|||
|---|---|---|---|
|
#18+
meolamiksoftпропущено... Можно гвоздями прибить...Тоже не прокатило, указывал FORCE INDEX(индекс_на_поле) , нифига, оптимизатор бежит по всеё таблице хоть ты тресни... давай тогда полностью определение таблицы и индексов, запрос и план. без изменений, один в один как выполняется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 07:33:30 |
|
||
|
не работает индекс в условии where с полем типа datetime
|
|||
|---|---|---|---|
|
#18+
Блин, полдня мускул насиловал и в конце концов он сдался)). Вообще-м решение такое: изменил set на select и оптимизатор тут же подхватил индекс на поле в условии where, почему-то для мускула это принципиально, какие есть предположения на этот счет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 19:06:14 |
|
||
|
не работает индекс в условии where с полем типа datetime
|
|||
|---|---|---|---|
|
#18+
meolaизменил set на select Это как? планов, кстати, мы так и не увидели... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 19:10:22 |
|
||
|
не работает индекс в условии where с полем типа datetime
|
|||
|---|---|---|---|
|
#18+
miksoftmeolaизменил set на select Это как? планов, кстати, мы так и не увидели...Вот так: Код: sql 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 19:14:57 |
|
||
|
не работает индекс в условии where с полем типа datetime
|
|||
|---|---|---|---|
|
#18+
meola, Ага, понял. Пока единственная гипотеза, которая у меня есть - что-то не так с типами переменных. И не всегда правильно оптимизатор выбирает направление приведения типов. Когда поле1 приводится к типу переменных - индекс, конечно, использоваться не может (и даже хинт не поможет). А вот когда переменные приводятся к типу поля поле1 или приведение не происходит вовсе - тогда индекс использоваться должен. Но в эту гипотезу не укладывается стартовый пост топика. Тут, чтобы разобраться до конца, все-таки нужны полные данные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 19:27:04 |
|
||
|
|

start [/forum/topic.php?fid=47&fpage=139&tid=1833280]: |
0ms |
get settings: |
8ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
33ms |
get topic data: |
15ms |
get forum data: |
2ms |
get page messages: |
66ms |
get tp. blocked users: |
2ms |
| others: | 200ms |
| total: | 348ms |

| 0 / 0 |
