我需要优化这个查询
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 秒。我怎样才能减少它的执行时间?非常感谢任何类型的帮助。
最佳答案
我创建了一个演示并在不使用正则表达式的情况下对其进行了测试:
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先生可以测试一下。
关于php - 优化包含正则表达式的查询以进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28403743/