优化包含regexp的查询以进行排序

时间:2015-02-09 06:07:55

标签: php mysql regex query-optimization

我需要优化此查询

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秒而不需要排序。如何减少执行时间?非常感谢任何类型的帮助。

1 个答案:

答案 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先生可以测试一下。