【问题标题】:LIKE CONCAT vs REGEXP mysqlLIKE CONCAT vs REGEXP mysql
【发布时间】:2016-11-22 19:48:18
【问题描述】:

我想从我的 mysql 数据库中选择包含字符串中的一个单词的行,该字符串是一个 php 变量。 我找到了两种方法:

"SELECT * FROM table WHERE '$string' REGEXP word_column"

和

"SELECT * FROM table WHERE '$string' LIKE CONCAT('%',word_column,'%')"

例如,如果我的数据库是:

id | word_column
 0 | red
 1 | blue
 2 | green
 ...

然后

<?php
...
$string = 'This string contains word red, so I want mysql to return row 0!';
$best_query = ""; //HERE GOES ONE OF THE QUERIES ABOVE
$result_i_want = mysqli_query($db_connect, $best_query);
...
?>

这两个查询都有效,但哪个查询的性能最好?

【问题讨论】:

  • 一般来说,like 会比regexp 快...
  • 两者都不会像使用全文索引那样快,但是......看不到索引如何帮助将表中的单词与完整字符串匹配。
  • 我的猜测是哪个更快将取决于实际数据; like 通常可能比 regexp 快(如 sgeddes 所述),但您还需要计算您使用过的 CONCAT 的成本(在可能相对较长的字符串上昂贵)。
  • INSTR 将是另一种可能的选择。
  • MySQL | REGEXP VS Like的可能重复

标签: php mysql database performance


【解决方案1】:
"SELECT * FROM table WHERE '$string' LIKE CONCAT('%',word_column,'%')"

更快。正如评论者所指出的,性能在某种程度上也取决于您的数据集。

【讨论】:

  • 这里唯一的问题是“哪个性能最好?”。为什么你觉得我没有回答这个问题?
【解决方案2】:

要搜索整列,不要使用LIKE 或REGEXP:

SELECT ... WHERE word_column = '$string'
-- and have
INDEX(word_column)

用于搜索嵌入在字符串中的单词:

SELECT ... WHERE MATCH(string_column) AGAINST ('+$string' IN BOOLEAN MODE)
-- and have
FULTEXT(string_column)

(研究有关 FULLTEXT 的文档;有一些限制。)

【讨论】:

    猜你喜欢
    • 2017-01-15
    • 1970-01-01
    • 1970-01-01
    • 2014-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-29
    • 2015-01-21
    相关资源
    最近更新 更多