2017-10-23 10 views
0

私は、最適化が必要なテーブルスキーマを作成しています。これは、3〜500万レコードのテーブルを作成する理由です。ここでの大きな懸念は、検索に関してです。この場合、有名なLIKE %% ...はオプションではありません。これを避けるために、挿入するたびに、メインフィールドに基づいて3つのキーワードが作成されます何か、例の名前:次の列と定義済みのキーワードを使用してテーブルスキーマを作成する

架空のテーブル「都市」

id | name | visibility | key_1 | key_2 | key_3 

したがって、この場合には、我々は二つの言葉を持っています、の記録として、ニューヨークの街を入力してみましょう。そのようにし

key_1 = new 
key_2 = york 

、数百万レコードを持つテーブルでの検索は次のようになります。

select name from cities 
    where visibility = 1 
     and(
      key_1 = 'new' or 
      key_1 = 'york' or 
      key_2 = 'new' or 
      key_2 = 'york' 
     ); 

質問です:それも全文または%% LIKEワイルドカードよりも高速になりますか?それは良い練習ですか?

私はこの技術を使用している大企業を見てきましたが、私はあなたの意見をお聞かせください。

ありがとうございます!クエリ内の

+0

_Columns_、フィールドではありません。 – jarlh

+0

@jarlhありがとう、私は非常によく英語を話していません – Mystic

答えて

1

マイナー補正:

select name from cities 
    where visibility = 1 
     and 'new' in (key1, key2) 
and 'york' in (key1, key2) ; 
+0

ありがとう、この方法についてどう思いますか、検索のパフォーマンスには良いですか? – Mystic

+0

ああ、神秘的..... –

1

パフォーマンスをしたい場合は、1つの都市ごとの行とキーあたり1で、CityKeysというテーブルが欲しいです。キー事項の順序は、その後、あなたがロジックにkeynumber列を含めることができる場合

select c.name 
from cities c 
where c.visibility = 1 and 
     exists (select 1 from citykeys ck where ck.cityid = c.cityid and ck.key = 'new') and 
     exists (select 1 from citykeys ck where ck.cityid = c.cityid and ck.key = 'york') ; 

その後、としてクエリを記述することができます。

これは、citykeys(cityid, key)のインデックスを利用することができます。

関連する問題