Мне нужно оптимизировать этот запрос
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 секунды без сортировки. Как я могу сократить время его выполнения? Любая помощь очень ценится.
Я создал демо и протестировал его без использования регулярных выражений:
select IF(concat('',SUBSTRING(title,1,1)*1) = SUBSTRING(title,1,1),'true','false' ) as col from test;
Основная идея взята из Определить, является ли значение числом в MySQL. Я нашел первую строку заголовка и проверил, номер это или нет.
DEMO В этой демонстрации я написал оба запроса с регулярным выражением и без регулярного выражения. То, что я нашел без использования запроса REGEX, заняло меньше времени. Попробуйте откомментировать один запрос за раз и посмотреть время выполнения.
Я не проверял это с большим количеством данных. @ Кешав, сэр, можете это проверить.
Других решений пока нет …