Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
构建一个搜索过程-MySQL-LIKE与多值vs-LIKE与Temp表_Mysql_Sql_Stored Procedures - Fatal编程技术网

构建一个搜索过程-MySQL-LIKE与多值vs-LIKE与Temp表

构建一个搜索过程-MySQL-LIKE与多值vs-LIKE与Temp表,mysql,sql,stored-procedures,Mysql,Sql,Stored Procedures,我相信这个问题已经被问到了很多方面,但我找不到一个全面阐述我的具体情况的答案——所以就这样 我正在跨多个表和字段构建搜索功能。有一个表存储个人信息,另一个表存储他们的地址信息,还有一个表存储他们的电话信息 屏幕提供关键字输入-这将触发搜索。用户可以输入单个关键字或多个逗号分隔的关键字 当我评估各种选项时,这里是我想到的 在存储过程中执行搜索,因为搜索查询将针对多个不同的表和不同的字段运行—这一完整的SQL逻辑最好保存在数据库层中。 将关键字作为逗号分隔或管道分隔字符串从PHP发送到存储过程-因此

我相信这个问题已经被问到了很多方面,但我找不到一个全面阐述我的具体情况的答案——所以就这样

我正在跨多个表和字段构建搜索功能。有一个表存储个人信息,另一个表存储他们的地址信息,还有一个表存储他们的电话信息

屏幕提供关键字输入-这将触发搜索。用户可以输入单个关键字或多个逗号分隔的关键字

当我评估各种选项时,这里是我想到的

在存储过程中执行搜索,因为搜索查询将针对多个不同的表和不同的字段运行—这一完整的SQL逻辑最好保存在数据库层中。 将关键字作为逗号分隔或管道分隔字符串从PHP发送到存储过程-因此,关键字的所有预处理都是在PHP中完成的 让存储过程处理搜索查询并返回一个易于显示的组合结果集 我有多种选择来设计存储过程,这就是我从社区寻求建议/输入的地方

在大量阅读了LIKE与REGEXP的使用之后,我决定使用LIKE选项将关键字与数据库中的各种属性相匹配,然后根据各种表生成结果集的并集以发送回数据库

喜欢职业选手的速度非常快。它使用起来非常简单,可以完成任务

缺点-如果用户输入多个关键字,那么逻辑会变得非常复杂,因为我必须在存储过程中生成多个或类似的%keyword%语句。另一种选择是使用临时表,并将每个关键字搜索的结果插入到同一个表中

问题-使用临时表是否会显著降低存储过程的性能?要匹配的平均行数将在8000到10000之间,最大限制可能为100000


因此,如果我使用WHILE循环搜索表中的每个关键字并将结果插入临时表,而不是动态生成或类似语句并运行单个查询,那么性能会显著下降。

到目前为止,由于以下原因,我决定将INSERT插入到临时表中,而不是使用多个LIKE语句

查询语句过于复杂-多个LIKE子句刚刚创建了一个非常复杂的存储过程设计和结果查询 单个查询的效率可能与一个大型复杂查询的效率一样——即使有一个折衷,我怀疑它也会很小。我还没有用实时数据测试过这个,但是一旦我有足够的容量,我会发布更新
喜欢并不总是很快,事实上喜欢真的能让事情变慢。当使用前面带有通配符的like语句时,例如“%someterm%”,MySQL不能使用索引,因此将执行表扫描。一旦开始缩放,速度就会大大减慢。除非绝对必要,否则不要使用LIKE