Mysql:LIKE CONCAT替换 - >性能较差

时间:2017-07-09 14:59:34

标签: mysql string performance search concat

所以我有一个SELECT语句,它将table_1列“table_1_content”中的当前列内容与table_2中另一列(table_2_content)的内容进行比较,而“table_2_content”中的内容可以在“table_1_content”中的任何位置找到:

$select = "SELECT * FROM table_1, table_2 WHERE `table_1_content` LIKE CONCAT('%', table_2_content, '%')";
$result = mysqli_query($con, $select);

我的问题是LIKE CONCAT非常重要。

是否有其他方法可以搜索不同表中的两列,以便每次执行查询时都不会执行全表扫描?

1 个答案:

答案 0 :(得分:2)

LIKE总自由文本格式(搜索字符串的开头和结尾处为%)是性能重要部分。字符串开头的通配符是否必要?如果是这样:您可能必须考虑以不同的方式预处理数据,以便搜索可以使用单个通配符或根本不使用通配符。最后一部分(取决于数据)例如通过用分隔符拆分字符串并将数据存储在单独的行中来完成,之后可以使用更快的比较和索引。

要将数据放在多行中,我们假设一个可用的分隔符(可以是多个,代码只会变长):

CREATE TABLE baseinfo (id INT NOT NULL auto_increment primary key,
  some other columns);

CREATE TABLE explodedstring(id INT NOT NULL, str VARCHAR(200),
   FOREIGN KEY (id) REFERENCES baseinfo(id));

CREATE PROCEDURE explodestring(id int, fullstr VARCHAR(4000))
BEGIN
  {many examples exist already how to do this on SO}
END;

该过程将从原始数据(在本例中为id)和原始字符串中输入您的密钥。 该过程的输出将最终出现在辅助表explodedstring中,您现在可以对其执行正常选择(为性能添加一些索引)。生成的id会告诉您哪条记录匹配。