Использование FInd_IN_SET vs IN хранимой процедуры MYSQL

У меня есть хранимая процедура, аналогичная приведенной ниже.

SELECT * 
FROM Table1
WHERE Tag IN (ids)

здесь Tag — столбец Integer.

Я устал передавать значения, разделенные запятыми, в виде строки в хранимую процедуру, но это не работает. Затем я использовал хранимую процедуру, как показано ниже.

SELECT * 
FROM Table1
WHERE FIND_IN_SET(Tag, ids) 

Это работает очень хорошо, единственная проблема в том, что моя таблица очень большая - миллионы строк, и использование FIND_IN_SET занимает слишком много времени по сравнению с IN при выполнении прямого оператора SQL.

Какой вариант оптимизации производительности лучше всего использовать?

Есть ли функция разделения, которая может преобразовать идентификаторы в целое число и проанализировать его, готовое к предложению IN? Думаю, это будет лучший вариант. Любые предложения или идеи?


person Justin Homes    schedule 14.07.2013    source источник
comment
stackoverflow.com/questions/6152137/mysql-string-split   -  person SQL.injection    schedule 14.07.2013


Ответы (1)


Вы можете подготовить оператор, а затем выполнить его:

set @sql = concat('select * from table1 where tag in (', ids, ')');

PREPARE q FROM @sql;

execute q;

Это создает строку для каждого выполнения, поэтому вы можете использовать in. В результате выполнение должно иметь возможность использовать индекс для tag, что должно значительно ускорить работу.

person Gordon Linoff    schedule 14.07.2013
comment
что на самом деле работает в одном тесте - person Justin Homes; 14.07.2013