0

私はテーブルを持っています: items(id,description)。私のプログラムでは、単語 (word1 から wordN) のリストを入力として取得し、テーブル内の各説明にそれらの単語がいくつ含まれるかを計算し、その数に基づいて結果を並べ替える必要があります。これが私の解決策ですが、パフォーマンスを改善する方法についての提案を歓迎します。ありがとう。

SELECT x, COUNT(*) 
FROM (SELECT description as x, id FROM items where description LIKE '%word1%'
      UNION ALL
      SELECT description as x, id FROM items where description LIKE '%word2%'
      UNION ALL
       ...
      UNION ALL
      SELECT description as x, id FROM items where description LIKE '%wordN%')
GROUP BY (id)
ORDER BY COUNT(*) DESC
4

2 に答える 2

1

実行計画を見ると、結合した SELECT ごとに別々のテーブル スキャンが行われていることがわかります。用語にワイルドカード プレフィックスを使用して検索を行っているため、クエリが検索不能であることを意味します。したがって、説明列にインデックスがあっても、それを利用できないため、スキャンが行われます。

条件を 1 つに組み合わせることで、テーブルを n 回ではなく 1 回だけスキャンするようにできます。

SELECT description as x, id 
FROM items 
WHERE description LIKE '%word1%'
    OR description LIKE '%word2%'
    OR description LIKE '%wordn%'

これを実行すると、単一のテーブル スキャンを含む実行計画が表示されるので、1 回のスイープですべての照合が行われます。

ただし、アイテムが一致する用語の数に基づいて結果をランク付けしているように見えるため、元のクエリは少し異なります。そのため、パフォーマンスと機能の両方の理由から、全文検索を検討する価値があるかもしれません。

于 2012-04-10T11:12:05.947 に答える
0
SELECT x, COUNT(*) 
FROM (SELECT description as x, id FROM items where description LIKE '%word1%' 
       or description LIKE '%word2%'
       or description LIKE '%wordN%')
GROUP BY (id)
ORDER BY COUNT(*) DESC

これはもっと良いはずです...

于 2012-04-10T11:06:46.257 に答える