所以我有一个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非常重要。
是否有其他方法可以搜索不同表中的两列,以便每次执行查询时都不会执行全表扫描?
答案 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
会告诉您哪条记录匹配。