PHP:多个 SQL 查询与一个怪物

Posted

技术标签:

【中文标题】PHP:多个 SQL 查询与一个怪物【英文标题】:PHP: Multiple SQL queries vs one monster 【发布时间】:2009-07-03 21:21:33 【问题描述】:

我有一些非常时髦的代码。正如您从下面的代码中看到的那样,我添加了一系列过滤器来查询。现在是否更容易只使用多个查询,使用它自己的一组过滤器,然后将结果存储在一个数组中,还是搞得一团糟?

有没有人有更好的解决方案来解决这个混乱?我需要能够按关键字和项目编号进行过滤,并且需要能够使用多个值进行过滤,不知道哪个是哪个。

//Prepare filters and values
$values = array();
$filters = array();
foreach($item_list as $item)
    $filters[] = "ItemNmbr = ?";
    $filters[] = "ItemDesc LIKE ?";
    $filters[] = "NoteText LIKE ?";
    $values[] = $item;
    $values[] = '%' . $item . '%';
    $values[] = '%' . $item . '%';

//Prepare the query
$sql = sprintf(
    "SELECT ItemNmbr, ItemDesc, NoteText, Iden, BaseUOM FROM ItemMaster WHERE %s LIMIT 21",
    implode(" OR ", $filters)
);
//Set up the types
$types = str_repeat("s", count($filters));
array_unshift($values, $types);

//Execute it
$state = $mysqli->stmt_init();
$state->prepare($sql) or die ("Could not prepare statement:" . $mysqli->error);
call_user_func_array(array($state, "bind_param"), $values);
$state->bind_result($ItemNmbr, $ItemDesc, $NoteText, $Iden, $BaseUOM);
$state->execute() or die ("Could not execute statement");
$state->store_result();

【问题讨论】:

【参考方案1】:

我看不出您的查询有什么特别可怕的地方。 我唯一会做的不同是将搜索词分开。

即 $item_list 可以分为数字项和文本项。

那么您可以进行如下搜索:

...WHERE ItemNmbr IN ( number1, number2, number3) OR LIKE .... $text_items go here.... 

IN 的效率要高得多,如果您的 $item_list 不包含任何文本部分……那么您只是在搜索一堆非常快的数字。

如果您在查询中使用了很多 LIKE,那么接下来的部分也许您应该考虑使用 MySQL Full-text Searching。

【讨论】:

我也可以使用 MATCH .. AGAINST 按项目编号搜索吗?因为不幸的是,由于某些被遗忘的原因,项目编号不仅仅是数字......【参考方案2】:

你的答案取决于你到底需要什么。仅使用 1 个查询的优点是资源使用。一个查询只需要 1 次连接和 1 次与 sql server 的通信。并且取决于您到底要做什么,在 1 条语句中执行此操作所需的 SQL 能力可能比在多个语句中执行的要少。

但是,从程序员的角度来看,使用一些不太复杂的 sql 语句来创建比 1 个大语句更少的语句可能更实用。请记住,最终您正在对此进行编程,并且您需要使其工作。脚本处理与 sql 处理可能并没有真正的区别。只有你才能打出最终的电话,哪个更重要?在处理大型数据库时,我通常会建议在脚本过程之上进行 SQL 处理。

【讨论】:

【参考方案3】:

SQL 引擎可以缓存单个表查询。 MySQL 及其同类不缓存连接表。性能的一般规则是仅在必要时使用连接。这鼓励了数据库引擎积极缓存表索引,也让你的代码更容易适应(更快的)对象数据库——就像亚马逊/谷歌云服务迫使你这样做。

【讨论】:

以上是关于PHP:多个 SQL 查询与一个怪物的主要内容,如果未能解决你的问题,请参考以下文章

许多(许多)SQL JOIN 与多个查询

在 php 中运行多个 SQL Server 查询

php 在SQL查询上使用数组获取多个值(SelectSqlItem)

PHP 如何从 AJAX 调用中发布多个数组/json 值并在同一个 SQL 查询中运行它们?

SQL PHP查询多个表数据

SQL查询从多个表返回数据