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では、2番目のオプションは選択しません。理由は次のとおりです。

  • NULL LIKE '%'常にfalseです(sqlserverでは、2番目のクエリはnull値を特徴とする行を返しません)
  • オプティマイザは、テーブルの統計に基づいて、あまりにも一般的なことを行います。これは、優先度の高い句が「%」の場合にひどいパフォーマンスにつながる可能性があります(sqlserverでは、常に関連する値が提供される列にいくつかのインデックスを使用するように指示するクエリヒントを使用できることに注意してください)

2番目のケースで私が見る唯一のポイントは、解釈するコードが少ないことです(php側とmysqlside)が、それだけの価値はないのではないかと思います。

これが少し役立つことを願っています、そしてあなたのエントリをサニタイズすることを忘れないでください

于 2013-01-25T09:58:41.773 に答える
0

これら 2 つのコード ブロックは等しくありません。
名が入力されていない場合、後者は何も検索しませんが、前者は姓で検索します。

LIKE を使用しているときに「どちらが速いか」を尋ねるのは意味がありません。どの構文を選択しても、常に遅くなります。

于 2013-01-25T09:17:21.153 に答える