1

我有一个包含大约 100.000 名客户的数据库可供搜索,使用我的搜索表单更好的做法和最快的做法是:

这样做会更好吗

if(strlen($_POST['firstname']))
{
   $search .= "AND `firstname` like :firstname";
}
if(strlen($_POST['lastname']))
{
   $search .= "AND `lastname` like :lastname";
}
// and so on for about 16 possible fields

或者做

$query = $this->db->query("SELECT * FROM `customers`
                           WHERE `firstname` LIKE :firstname,
                           AND `lastname` LIKE :lastname,
                           -- AND so on for about 16 elements");
4

2 回答 2

1

好久没用mysql了,所以根据我的sqlserver经验给个大概的回答(跑题见谅)

我假设您在所有 16 列上都有索引(或者至少是那些始终提供相关值的列)

在 SQL Server 中,我不会选择第二个选项,因为:

  • NULL LIKE '%'始终为假(在 sqlserver 中,您的第二个查询不会返回任何具有空值的行)
  • 优化器会根据表统计信息做一些过于笼统的事情。当高优先级子句只是 '%' 时,这将导致可怕的性能(请注意,在 sqlserver 中,您可以让查询提示告诉您使用某些索引来始终提供相关值的列)

我在第二种情况下看到的唯一一点是要解释的代码更少(php端和mysqlside),但恐怕这不值得。

希望这会有所帮助,不要忘记清理您的条目

于 2013-01-25T09:58:41.773 回答
0

这两个代码块不相等。
如果 firstname 未填写,则后者将一无所获,而前者将搜索 lastname。

在使用 LIKE 时询问“哪个更快”毫无意义 -无论您选择哪种语法,它总是很慢。

于 2013-01-25T09:17:21.153 回答