Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1
Всем привет! Внутри процедуры есть запрос вида:
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,
то оптимизатор индекс не использует, пробегается по всем полям таблички. Почему?
Неактивен
Как определяете использование индекса?
Чем обусловлен выбор CHAR(17)? С т.з. производительности datetime будет лучше.
Неактивен
vasya написал:
Как определяете использование индекса?
Чем обусловлен выбор CHAR(17)? С т.з. производительности datetime будет лучше.
Потому что значение поля передается с контроллера, а он "умеет" передавать только числа и строки
Неактивен
А первый вопрос - как вы определяете использование индекса в запросе внутри процедуры?
Можете привести пример воспроизводящий проблему? У меня не получается смоделировать такое поведение, т.е. запрос использует индекс независимо от того переменная (локальная/пользовательская) или константа.
Неактивен
satch написал:
vasya написал:
Как определяете использование индекса?
Чем обусловлен выбор CHAR(17)? С т.з. производительности datetime будет лучше.Потому что значение поля передается с контроллера, а он "умеет" передавать только числа и строки
Тогда вы можете сделать поле datetime, а значение передавать строкой вида '2015-01-31 23:59:59'.
Неактивен
vasya написал:
А первый вопрос - как вы определяете использование индекса в запросе внутри процедуры?
Можете привести пример воспроизводящий проблему? У меня не получается смоделировать такое поведение, т.е. запрос использует индекс независимо от того переменная (локальная/пользовательская) или константа.
С помощью хинта FORCE INDEX(ля-ля-ля) перед WHERE. Дык, собственно весь пример в топике темы, ни строчки больше
Неактивен
vasya написал:
satch написал:
vasya написал:
Как определяете использование индекса?
Чем обусловлен выбор CHAR(17)? С т.з. производительности datetime будет лучше.Потому что значение поля передается с контроллера, а он "умеет" передавать только числа и строки
Тогда вы можете сделать поле datetime, а значение передавать строкой вида '2015-01-31 23:59:59'.
Это понятно, но допустим рано или поздно понадобится повесить индекс на поле типа CHAR и использовать его в WHERE поле BETWEEN переменная_char1 AND переменная_char2 и как тогда быть?
Неактивен
satch написал:
С помощью хинта FORCE INDEX(ля-ля-ля) перед WHERE. Дык, собственно весь пример в топике темы, ни строчки больше
Что-то я теряю нить ваших рассуждений.
FORCE INDEX указывает оптимизатору использовать указанный индекс.
Мой же вопрос - каким образом вы определяете, что индекс не используется? Вот выполнили вы процедуру call ... и почему вы решили что при выполнении запроса внутри этой процедуры не был использован индекс?
Неактивен
vasya написал:
satch написал:
С помощью хинта FORCE INDEX(ля-ля-ля) перед WHERE. Дык, собственно весь пример в топике темы, ни строчки больше
Что-то я теряю нить ваших рассуждений.
FORCE INDEX указывает оптимизатору использовать указанный индекс.
Мой же вопрос - каким образом вы определяете, что индекс не используется? Вот выполнили вы процедуру call ... и почему вы решили что при выполнении запроса внутри этой процедуры не был использован индекс?
Потому что в процедуре простой select, перед которым пишу explain и при выполнении процедуры получаю ответ, в котором указано ALL, что, очевидно, индекс не используется.
Неактивен
Ok. (это я чтобы убедиться в правильности исходного заявления; а то на форуме бывает видят одно, пишут другое, подразумевают третье )
Тогда можете сделать воспроизводимый пример, т.е.
create table ..
insert into ..
explain select ..
create procedure ..
call ..
и
select version();
У меня пока добиться такого поведения,чтобы менялся план при переносе значения в переменную не получается. Возможно это баг вашей версии.
Неактивен
Полдня мускул насиловал и в конце концов он сдался)). Вообще-м решение такое: изменил set на select и оптимизатор тут же подхватил индекс на поле в условии where, почему-то для мускула это принципиально, какие есть предположения на этот счет?
Неактивен
Странно. Сделаете вы
set start = '20150101 00:00:00';
или
select '20150101 00:00:00' into start;
тип и кодировка переменной должны быть одинаковы.
Если оно действительно так, то делайте пример, воспроизводящего данный глюк, и пишите на bugs.mysql.com
Неактивен
Страниц: 1