SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 22.04.2015 19:17:22

satch
Участник
Зарегистрирован: 22.04.2015
Сообщений: 6

не работает индекс в условии where с полем типа datetime

Всем привет! Внутри процедуры есть запрос вида:
SELECT * FROM таблица WHERE поле1 BETWEEN '20150101 00:00:00' AND '20150131 23:59:59', где поле1 типа CHAR(17), а таблица MyISAM. Вешаю на поле1 индекс, оптимизатор его скушал, запрос отработал быстро, всё пучком. Но если делаю так:
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,
то оптимизатор индекс не использует, пробегается по всем полям таблички. Почему?

Неактивен

 

#2 22.04.2015 20:54:18

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5827

Re: не работает индекс в условии where с полем типа datetime

Как определяете использование индекса?
Чем обусловлен выбор CHAR(17)? С т.з. производительности datetime будет лучше.

Неактивен

 

#3 22.04.2015 21:29:59

satch
Участник
Зарегистрирован: 22.04.2015
Сообщений: 6

Re: не работает индекс в условии where с полем типа datetime

vasya написал:

Как определяете использование индекса?
Чем обусловлен выбор CHAR(17)? С т.з. производительности datetime будет лучше.

Потому что значение поля передается с контроллера, а он "умеет" передавать только числа и строки

Неактивен

 

#4 22.04.2015 21:53:07

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5827

Re: не работает индекс в условии where с полем типа datetime

А первый вопрос - как вы определяете использование индекса в запросе внутри процедуры?
Можете привести пример воспроизводящий проблему? У меня не получается смоделировать такое поведение, т.е. запрос использует индекс независимо от того переменная (локальная/пользовательская) или константа.

Неактивен

 

#5 22.04.2015 22:34:22

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5827

Re: не работает индекс в условии where с полем типа datetime

satch написал:

vasya написал:

Как определяете использование индекса?
Чем обусловлен выбор CHAR(17)? С т.з. производительности datetime будет лучше.

Потому что значение поля передается с контроллера, а он "умеет" передавать только числа и строки

Тогда вы можете сделать поле datetime, а значение передавать строкой вида '2015-01-31 23:59:59'.

Неактивен

 

#6 22.04.2015 22:58:31

satch
Участник
Зарегистрирован: 22.04.2015
Сообщений: 6

Re: не работает индекс в условии where с полем типа datetime

vasya написал:

А первый вопрос - как вы определяете использование индекса в запросе внутри процедуры?
Можете привести пример воспроизводящий проблему? У меня не получается смоделировать такое поведение, т.е. запрос использует индекс независимо от того переменная (локальная/пользовательская) или константа.

С помощью хинта FORCE INDEX(ля-ля-ля) перед WHERE. Дык, собственно весь пример в топике темы, ни строчки больше

Неактивен

 

#7 22.04.2015 23:02:10

satch
Участник
Зарегистрирован: 22.04.2015
Сообщений: 6

Re: не работает индекс в условии where с полем типа datetime

vasya написал:

satch написал:

vasya написал:

Как определяете использование индекса?
Чем обусловлен выбор CHAR(17)? С т.з. производительности datetime будет лучше.

Потому что значение поля передается с контроллера, а он "умеет" передавать только числа и строки

Тогда вы можете сделать поле datetime, а значение передавать строкой вида '2015-01-31 23:59:59'.

Это понятно, но допустим рано или поздно понадобится повесить индекс на поле типа CHAR и использовать его в WHERE поле BETWEEN переменная_char1 AND переменная_char2 и как тогда быть?

Неактивен

 

#8 22.04.2015 23:24:15

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5827

Re: не работает индекс в условии where с полем типа datetime

satch написал:

С помощью хинта FORCE INDEX(ля-ля-ля) перед WHERE. Дык, собственно весь пример в топике темы, ни строчки больше

Что-то я теряю нить ваших рассуждений.
FORCE INDEX указывает оптимизатору использовать указанный индекс.
Мой же вопрос - каким образом вы определяете, что индекс не используется? Вот выполнили вы процедуру call ... и почему вы решили что при выполнении запроса внутри этой процедуры не был использован индекс?

Неактивен

 

#9 23.04.2015 00:14:15

satch
Участник
Зарегистрирован: 22.04.2015
Сообщений: 6

Re: не работает индекс в условии where с полем типа datetime

vasya написал:

satch написал:

С помощью хинта FORCE INDEX(ля-ля-ля) перед WHERE. Дык, собственно весь пример в топике темы, ни строчки больше

Что-то я теряю нить ваших рассуждений.
FORCE INDEX указывает оптимизатору использовать указанный индекс.
Мой же вопрос - каким образом вы определяете, что индекс не используется? Вот выполнили вы процедуру call ... и почему вы решили что при выполнении запроса внутри этой процедуры не был использован индекс?

Потому что в процедуре простой select, перед которым пишу explain и при выполнении процедуры получаю ответ, в котором указано ALL, что, очевидно, индекс не используется.

Неактивен

 

#10 23.04.2015 01:30:26

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5827

Re: не работает индекс в условии where с полем типа datetime

Ok. (это я чтобы убедиться в правильности исходного заявления; а то на форуме бывает видят одно, пишут другое, подразумевают третье smile )

Тогда можете сделать воспроизводимый пример, т.е.
create table ..
insert into ..
explain select ..
create procedure ..
call ..
и
select version();

У меня пока добиться такого поведения,чтобы менялся план при переносе значения в переменную не получается. Возможно это баг вашей версии.

Неактивен

 

#11 23.04.2015 19:32:16

satch
Участник
Зарегистрирован: 22.04.2015
Сообщений: 6

Re: не работает индекс в условии where с полем типа datetime

Полдня мускул насиловал и в конце концов он сдался)). Вообще-м решение такое: изменил set на select и оптимизатор тут же подхватил индекс на поле в условии where, почему-то для мускула это принципиально, какие есть предположения на этот счет?

Неактивен

 

#12 23.04.2015 20:52:54

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5827

Re: не работает индекс в условии where с полем типа datetime

Странно. Сделаете вы
set start = '20150101 00:00:00';
или
select '20150101 00:00:00' into start;
тип и кодировка переменной должны быть одинаковы.

Если оно действительно так, то делайте пример, воспроизводящего данный глюк, и пишите на bugs.mysql.com

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson