SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 09.03.2016 18:03:03

klow
Старожил
Зарегистрирован: 06.12.2014
Сообщений: 411

FIND_IN_SET и индекс

Добрый день!
Я так понимаю, что конструкция

SELECT * from table WHERE FIND_IN_SET(ID, '1,2,3')>0
не использует индекс по ID?
Как можно заставить MySQL использовать индекс?

Неактивен

 

#2 09.03.2016 23:51:15

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: FIND_IN_SET и индекс

SELECT * from table WHERE ID IN (1,2,3);

С функцией FIND_IN_SET() индекс работать не будет.

Неактивен

 

#3 10.03.2016 09:45:42

klow
Старожил
Зарегистрирован: 06.12.2014
Сообщений: 411

Re: FIND_IN_SET и индекс

Через IN понятно, но его сложно использовать так как неизвестны сами значения в строке, и даже их количество может быть разное.
Пробовал через

WHERE str REGEXP '^[0-9]$' AND id=str
  OR str REGEXP '^[0-9],[0-9]$' AND (id=SUBSTRING_INDEX(SUBSTRING_INDEX(str, ',', 1), ' ', -1)
    OR id = SUBSTRING_INDEX(SUBSTRING_INDEX(str, ',', 2), ',', -1))
  OR ...

Но результат еще хуже

Отредактированно klow (10.03.2016 09:51:34)

Неактивен

 

#4 10.03.2016 09:48:02

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: FIND_IN_SET и индекс

Индекс будет работать только для IN, =, >, <, BETWEEN. Индекс никогда не будет работать, если вы вычисляете функцию от индексируемого поля.

Неактивен

 

#5 10.03.2016 09:54:15

klow
Старожил
Зарегистрирован: 06.12.2014
Сообщений: 411

Re: FIND_IN_SET и индекс

Тогда почему когда использую ID=str1 or ID=str2 ситуация хуже?

Неактивен

 

#6 10.03.2016 09:55:32

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: FIND_IN_SET и индекс

Для OR в MySQL плохие алгоритмы. Замените OR на UNION двух запросов.

Неактивен

 

#7 10.03.2016 10:10:41

klow
Старожил
Зарегистрирован: 06.12.2014
Сообщений: 411

Re: FIND_IN_SET и индекс

Спасибо за идею, но, к сожалению, воспользоваться не могу sad
Строка это ссылка столбец таблицы и он не опознается (ошибка) MySql

SELECT
 (SELECT GROUP_CONCAT(...) FROM (SELECT ...  where ... = t1.str UNION SELECT ... where ... = t1.str) t2 ) f1
from table1 t1
 
ругается на t1.str

Отредактированно klow (10.03.2016 10:11:59)

Неактивен

 

#8 10.03.2016 10:12:43

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: FIND_IN_SET и индекс

UNION должен делаться для полного запроса

(SELECT ... FROM table1 t1 WHERE .. ) UNION (SELECT ... FROM table1 t1 WHERE)


У метода тоже есть свои недостатки, но лучше, чем OR

Неактивен

 

#9 10.03.2016 10:35:58

klow
Старожил
Зарегистрирован: 06.12.2014
Сообщений: 411

Re: FIND_IN_SET и индекс

Это я понял, но это меня и не устраивает. Мне нужно в подзапросе это реализовать. Спасибо за идею, буду дальше думать.

Неактивен

 

Board footer

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