因此,我有一个 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 的性能很重。
有没有别的办法,通过不同表的两列进行搜索,这样每次执行查询时都不需要全表扫描?
最佳答案
完全自由文本格式的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
会告诉您哪个记录匹配。
关于Mysql: LIKE CONCAT Replacement --> less performance heavy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44997762/