SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 22.04.2014 11:22:00

Иней
Участник
Зарегистрирован: 22.04.2014
Сообщений: 3

составной индекс + inner join -> второй элемент индекса не используется

Я создал и использовал составной индекс

int ClientID;
DATETIME ServerPayCompleteTime;

на простом запросе всё хорошо ;

SELECT *
FROM `poltishokkzarchivedb`.`transaction_payed` t
where t.ClientID = 1 and t.ServerPayCompleteTime > '2014-03-01';

# id, select_type, table, type, possible_keys, key, key_len, ref, rows, Extra
'1', 'SIMPLE', 't', 'range', 'client_time', 'client_time', ?, NULL, '3347', 'Using where'

но как только используется дополнительная таблица (`termid`) с 1-ой записью:
SELECT
    *
FROM
    `poltishokkzarchivedb`.`transaction_payed` t, `test`.`termid` i
where t.ClientID = i.termid and t.ServerPayCompleteTime > '2014-03-01';

# id, select_type, table, type, possible_keys, key, key_len, ref, rows, Extra
'1', 'SIMPLE', 't', 'ref', 'client_time', 'client_time', ?, 'test.i.termid', '18476', 'Using where'

всё плохо.
т.е  используется только половина индекса. на большой таблице это получается очень долго.

Можно ли что-нибудь сделать? Сейчас я явно запрещаю использование этого индекса.
Когда для "ClientID" был примари индекс (без составного индекса) то , как ни странно, этот запрос выполнялся за приемлемое время.

Неактивен

 

#2 22.04.2014 23:19:49

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

Re: составной индекс + inner join -> второй элемент индекса не используется

А какая у вас версия? Судя по 'Using where' вместо ожидаемого 'Using index condition' устаревшая.

Можно попробовать переписать в виде

SELECT
    t.*
FROM
    `poltishokkzarchivedb`.`transaction_payed` t JOIN `test`.`termid` i
ON t.ClientID = i.termid and t.ServerPayCompleteTime > '2014-03-01';


А отчего у вас key_len показывает знак вопроса?

Неактивен

 

#3 23.04.2014 10:08:06

Иней
Участник
Зарегистрирован: 22.04.2014
Сообщений: 3

Re: составной индекс + inner join -> второй элемент индекса не используется

и имею две версии:
5.046 боевая
5.6  кандидат для обновления

для 5.6:
id,select_type,table,type,possible_keys,key,key_len,ref,rows,Extra
1,SIMPLE,t,index,client_time,client_time,9,NULL,10001,"Using where; Using index; Using join buffer (Block Nested Loop)"

устаревшая. написал:

похоже да, ошибка реализации

А отчего у вас key_len показывает знак вопроса? написал:

Это артефакт использования инструмента 5.6 для базы 5.0 - если нативным смотреть тогда key_len = 5

Можно попробовать переписать в виде написал:

без разницы, в боевом режиме поля явно указываются. (опробовал)

Неактивен

 

#4 23.04.2014 10:23:41

Иней
Участник
Зарегистрирован: 22.04.2014
Сообщений: 3

Re: составной индекс + inner join -> второй элемент индекса не используется

5.0.45-community-nt-log

Неактивен

 

#5 23.04.2014 12:41:36

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

Re: составной индекс + inner join -> второй элемент индекса не используется

Иней написал:

без разницы, в боевом режиме поля явно указываются. (опробовал)

Тут идея была в переносе условия на t.ServerPayCompleteTime из where в join. Емнип, это раньше помогало, но могу ошибаться. Тогда только обновление.

Неактивен

 

Board footer

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