оптимизация запроса, содержащего регулярное выражение для сортировки

Мне нужно оптимизировать этот запрос

SELECT DISTINCT abc.*
FROM abc, xyz, xyz_value
WHERE abc.CategoryID IN ( $category_children )
$where_var AND abc.Removed = 0 AND
xyz_value.Removed = 0 AND abc.abcID = xyz_value.GenericID AND
xyz_value.AttributeID = xyz.AttributeID $narrow_query
ORDER BY
if(abc.Title REGEXP ('^[0-9]') = 1,cast(abc.Title as UNSIGNED),999999) ASC,
if(abc.Title REGEXP ('^[0-9]') = 1,'z',abc.Title) $order_how
$limit

$category_children массив, содержащий группу идентификаторов категорий Атрибут для сортировки содержит строку, начинающуюся с цифр, алфавитов и специальных символов.
Этот запрос замедляется из-за регулярного выражения, используемого для сортировки, имеющего время выполнения 3 секунды. И это занимает 0,01 секунды без сортировки. Как я могу сократить время его выполнения? Любая помощь очень ценится.

0

Решение

Я создал демо и протестировал его без использования регулярных выражений:

select IF(concat('',SUBSTRING(title,1,1)*1) = SUBSTRING(title,1,1),'true','false' ) as col from test;

Основная идея взята из Определить, является ли значение числом в MySQL. Я нашел первую строку заголовка и проверил, номер это или нет.

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

Я не проверял это с большим количеством данных. @ Кешав, сэр, можете это проверить.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]