我应该在MySQL或PHP中执行正则表达式过滤吗?

我应该在MySQL或PHP中执行正则表达式过滤吗?,php,mysql,regex,Php,Mysql,Regex,我有一个MySQL列,它保存各种字符串数据,它是一个VARCHAR字段 该表有超过100k条记录,我想按此字段筛选查询,以仅选择此字段以除1,2,3,4,5,6,7,8,9以外的任何字符开头的记录 是不是更快: 在SQL查询中写入REGEXP,或 只需选择所有记录并通过执行PHP正则表达式在PHP中过滤掉它们? SQL查询速度会更快,可以直接使用。这正是SQL的用意 为了澄清以供将来参考:当您需要DB返回特定的数据集时,您应该让DB使用SQL查询来构造数据集。然后,您的应用程序代码可以有一个或多

我有一个MySQL列,它保存各种字符串数据,它是一个VARCHAR字段

该表有超过100k条记录,我想按此字段筛选查询,以仅选择此字段以除1,2,3,4,5,6,7,8,9以外的任何字符开头的记录

是不是更快:

在SQL查询中写入REGEXP,或 只需选择所有记录并通过执行PHP正则表达式在PHP中过滤掉它们?
SQL查询速度会更快,可以直接使用。这正是SQL的用意

为了澄清以供将来参考:当您需要DB返回特定的数据集时,您应该让DB使用SQL查询来构造数据集。然后,您的应用程序代码可以有一个或多个抽象来表示和处理业务用例的结果数据集,但它不应该完成DB引擎的工作


TL;DR:从DB表构建数据集是数据访问层的问题,处理与业务实体相关的抽象是应用层的问题

SQL查询速度更快,而且可以直接操作。这正是SQL的用意

为了澄清以供将来参考:当您需要DB返回特定的数据集时,您应该让DB使用SQL查询来构造数据集。然后,您的应用程序代码可以有一个或多个抽象来表示和处理业务用例的结果数据集,但它不应该完成DB引擎的工作


TL;DR:从DB表构建数据集是数据访问层的关注点,处理与业务实体相关的抽象是应用层的关注点

我重新打开了,因为dup具有相反的条件-行不以…开头

对于以一些连续字符集开始的行,例如1..9,有一个显著的优化:

INDEX(col)

SELECT ... WHERE col >= '1'
             AND col  < CHAR(ORD('9') + 1)
这将只扫描1..9行,而不是整个表,如PHP方法所需,并且其他问题的所有三个答案都需要

第二个原因是它不是另一个的dup——这里的问题更多的是关于PHP和MySQL的。在MySQL中执行此操作的主要性能参数是节省传输时间


如果您需要更高级的REGEXP,您可以切换到MariaDB,我认为它具有与PHP相同的REGEXP引擎。如果您需要一些对SQL来说太复杂的东西,即使使用更好的regexp,您也可能被迫使用PHP。但即使在这种情况下,在SQL中也要尽可能多地进行过滤,以最大限度地减少“连线”上的数据量。

我重新打开了dup,因为dup有相反的条件-行不是以

对于以一些连续字符集开始的行,例如1..9,有一个显著的优化:

INDEX(col)

SELECT ... WHERE col >= '1'
             AND col  < CHAR(ORD('9') + 1)
这将只扫描1..9行,而不是整个表,如PHP方法所需,并且其他问题的所有三个答案都需要

第二个原因是它不是另一个的dup——这里的问题更多的是关于PHP和MySQL的。在MySQL中执行此操作的主要性能参数是节省传输时间


如果您需要更高级的REGEXP,您可以切换到MariaDB,我认为它具有与PHP相同的REGEXP引擎。如果您需要一些对SQL来说太复杂的东西,即使使用更好的regexp,您也可能被迫使用PHP。但即使在这种情况下,在SQL中也要尽可能多地进行过滤,以尽量减少“连线”上的数据量。

在MySQL中可能要快得多。请参见在数据库上执行此操作,这样您就不会返回大量冗余数据。这正是数据库设计的目的。你的第二个选择绝对不好。当涉及db数据访问时,让非常强大的db引擎完成所有可能的工作。不管sql语句变得多么复杂,都不要担心更快。除非数据量巨大,否则差异将是微不足道的。取而代之的是,专注于哪个更容易阅读和维护。@AndyLester在PHP中对100K记录执行for循环肯定会导致性能下降。相信我,我已经尝试过了……在MySQL中可能会快得多。请参见在数据库上执行此操作,这样您就不会返回大量冗余数据。这正是数据库设计的目的。你的第二个选择绝对不好。当涉及db数据访问时,让非常强大的db引擎完成所有可能的工作。不管sql语句变得多么复杂,都不要担心更快。除非数据量巨大,否则差异将是微不足道的。取而代之的是,专注于哪个更容易阅读和维护。@AndyLester在PHP中对100K记录执行for循环肯定会导致性能下降。相信我,我已经试过了。。。