2011-03-13 24 views
1

このクエリを実行する最良の方法があるかどうかは疑問でした。PHP MySQLクエリの最適化

$searchTerm = explode(' ', $search); 
$wall_sql = "SELECT filename, category, name, downloads FROM wallpapers WHERE (pending='0' AND mediaType='0') AND ("; 
for($i=0;$i<count($searchTerm);$i++){ 
    if($i != 0){ 
     $wall_sql .= " OR ";  
    } 
    $wall_sql .= " (category LIKE '%".$searchTerm[$i]."%') OR (filename LIKE '%".$searchTerm[$i]."%') OR (tags LIKE '%".$searchTerm[$i]."%') OR (name LIKE '%".$searchTerm[$i]."%') ";   
} 
$wall_sql .= ") ORDER BY ordernum DESC "; 

このスクリプトは、$ searchという検索語をPHPのexplode関数を使って配列に分割します。その配列をループしてクエリを構築します。これが私がそれをすると考えることができる唯一の方法です、私はそれがそれを行うための最善の方法であると確信していません。また、もしそうなら、どんなインデックスもこのクエリで動作しますか?

+1

FYI:

は、読みやすくするためのビットコードをリファクタリングでしたあなたのコードは、SQLインジェクションの可能性を有しています。 –

答えて

1

クエリではインデックスを使用できず、LIKEを使用すると誤った一致が発生する可能性があります(たとえば、x LIKE '%red%'の検索はhiredと一致します)。

まだ検討していない場合はfull text searchを検索してください。このタイプの検索ではFULLTEXTインデックスを使用できます。

0

あなたが入力したクエリは通常の検索クエリであり、これはうまく機能します。パフォーマンスを向上させたい場合は、フルテキストインデックスを追加してフルテキスト検索を使用するか、Sphinxのようなツールを使用できます。 Sphinxは、全文検索が非常に高速になるようにデータベースを索引付けします。ただし、インストールして保守する必要があります。

0

私はテーブルの列との結合で、検索条件に基づいていくつかの仮想テーブルを作成します。あなたは動的、静的なハードコードされた値(term1,2,3とfilename1,2,3)として仮想テーブル値を構築します、とあなたは上のインデックスを追加する必要があります。この場合

SELECT w.filename, 
     w.category, 
     w.name, 
     w.downloads 
FROM wallpapers w 
     LEFT JOIN (SELECT 'term1' AS name 
      UNION 
      SELECT 'term2' AS name 
      UNION 
      SELECT 'term3' AS name) cat 
     ON cat.name = w.category 
     LEFT JOIN (SELECT 'filename1' AS name 
      UNION 
      SELECT 'filename2' AS name 
      UNION 
      SELECT 'filename3' AS name) f 
     ON f.name = w.filename 
WHERE w.pending = '0' 
     AND w.mediatype = '0' 
     AND (cat.name IS NOT NULL OR f.name IS NOT NULL) 
GROUP by w.id 
ORDER BY w.ordernum DESC 

よう

何か次の列

  1. (保留、MEDIATYPE)
  2. (ordernum)
  3. (カテゴリ)
  4. (ファイル名)
  5. あなたはすべての権利、それをやっている、あなたのタスクを記述する方法を主キーid
1

を持っていると仮定。 LIKE '%search_term%'を使用すると、索引がウィンドウから外れています。

$searchTerm = explode(' ', $search); 
foreach ($searchTerm as $s){ 
    $f[] = "category LIKE '%".$s."%'"; 
    $f[] = "filename LIKE '%".$s."%'"; 
    $f[] = "tags LIKE '%".$s."%'"; 
    $f[] = "name LIKE '%".$s."%'"; 
} 
$wall_sql = " 
SELECT filename, category, name, downloads 
    FROM wallpapers 
    WHERE pending='0' AND mediaType='0' 
    AND (".implode(" OR ",$f).") 
ORDER BY ordernum DESC";