php - 优化包含正则表达式的查询以进行排序

标签 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 秒。我怎样才能减少它的执行时间?非常感谢任何类型的帮助。

最佳答案

我创建了一个演示并在不使用正则表达式的情况下对其进行了测试:

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/

相关文章:

php - 如何替换 Symfony 中未找到的图像

php - Android 和 PHP 创建 API

php - 如何将分数作为另一表中值的平均值插入到一个表中?

php - 如何在 PHP MYSQL 中关联两列

php - 使使用 PhP 输出的文件在新选项卡/窗口中打开

mysql - 计算已知深度的层次结构中的值

php - Symfony2 : Same codebase with multiple environments leads to tons of cache files

php - 如何扩展正则表达式以查找多个匹配项?

php - 我的正则表达式没有正确替换

用于捕获星号之间内容的正则表达式,单词除外