字符串搜索的sql性能与php性能

字符串搜索的sql性能与php性能,php,sql,performance,Php,Sql,Performance,我得到了一份新工作的测试,我无法决定该走哪条路,问题如下: 在给定的数据库表上(我为另一个问题而设计): 假设我想在给定用户的所有消息中搜索文本,这样做是否会更快: $query = "SELECT * FROM messages m WHERE user_id='$id' AND message LIKE '%$string%'; $query = "SELECT * FROM messages m WHERE user_id='$id'; 或者,这样做会更快: $query = "SEL

我得到了一份新工作的测试,我无法决定该走哪条路,问题如下:

在给定的数据库表上(我为另一个问题而设计):

假设我想在给定用户的所有消息中搜索文本,这样做是否会更快:

$query = "SELECT * FROM messages m WHERE user_id='$id' AND message LIKE '%$string%';
$query = "SELECT * FROM messages m WHERE user_id='$id';
或者,这样做会更快:

$query = "SELECT * FROM messages m WHERE user_id='$id' AND message LIKE '%$string%';
$query = "SELECT * FROM messages m WHERE user_id='$id';
然后在我得到的结果集上运行一个
substr\u count()


或者有什么更快、更有效的方法可以做到这一点吗?

您应该始终在数据库端进行搜索。尽管像“%word%”这样的
总是会导致全表扫描,但并非每一行都必须序列化、传输到客户端并再次反序列化


此外,如果您可以优化查询以使用全文索引或仅匹配单词的最后一部分(例如,
如“word%”
),则无需进行全表扫描,因为它可以在索引上进行计算(如果存在)。

您应该始终在数据库端进行搜索。尽管像“%word%”这样的
总是会导致全表扫描,但并非每一行都必须序列化、传输到客户端并再次反序列化


此外,如果您可以优化查询以使用全文索引或仅匹配单词的最后一部分(例如,
如“word%”
),则无需进行完整表扫描,因为可以通过索引(如果存在)对其进行评估。

第一种方法应该更快。如果您的目标只是查找匹配消息的数量,那么应该更快地执行以下操作:

SELECT count(*) FROM messages m WHERE user_id='$id' AND message LIKE '%$string%

第一种方法应该更快。如果您的目标只是查找匹配消息的数量,那么应该更快地执行以下操作:

SELECT count(*) FROM messages m WHERE user_id='$id' AND message LIKE '%$string%

我认为,发现这一点的最佳方法是使用一些基准数据。我认为,发现这一点的最佳方法是使用一些基准数据。您建议如何优化查询?对不起,如果你能详细说明一下,我不太明白。。。如果所有的优化都是全文索引或做更多的事情……正如我所说:固定前缀(
如'word%'
)可以在索引上进行计算(如果它存在的话)。因此,您可以从col='word%'的表中查询
SELECT*,而不是从col='word%'的表中查询
SELECT*,
,但我不知道这是否符合您的需要。你是唯一能做出决定的人。此外,大多数数据库系统支持一种称为全文索引的结构。对于MySQL,请看一看,对于PostGreSQL,请看一看-通过此功能,您可以搜索未知前缀Show您建议优化查询吗?对不起,如果你能详细说明一下,我不太明白。。。如果所有的优化都是全文索引或做更多的事情……正如我所说:固定前缀(
如'word%'
)可以在索引上进行计算(如果它存在的话)。因此,您可以从col='word%'的表中查询
SELECT*,而不是从col='word%'的表中查询
SELECT*,
,但我不知道这是否符合您的需要。你是唯一能做出决定的人。此外,大多数数据库系统支持一种称为全文索引的结构。对于MySQL,请看一看,对于PostGreSQL,请看一看-通过这个,您可以搜索未知前缀