我需要优化此查询
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
是一个包含一堆类别ID的数组。要排序的属性包含从数字,字母和特殊字符开始的字符串。
由于用于排序的正则表达式具有3秒的执行时间,因此该查询变慢。它需要0.01秒而不需要排序。如何减少执行时间?非常感谢任何类型的帮助。
答案 0 :(得分:0)
我创建了一个演示并在不使用正则表达式的情况下对其进行了测试:
select IF(concat('',SUBSTRING(title,1,1)*1) = SUBSTRING(title,1,1),'true','false' ) as col from test;
基本理念来自Detect if value is number in MySQL。我找到了第一个标题字符串并检查它是否为数字。
DEMO在这个演示中我写了两个查询都有正则表达式而没有正则表达式。我在没有使用REGEX查询的情况下找到了更少的时间。尝试一次取消注释一个查询并查看执行时间。
我还没有用大量数据对其进行测试。 @Keshav先生可以测试一下。