2017-09-11 8 views
0

文化によって異なる照合が必要な場合に、文字列のORDER BYを効率的に実行する方法はありますか?つまり、異なる文化のユーザーのデータは、同じテーブルと同じ列に格納されますが、各ユーザーは当然、そのロケールに応じて順序付けられていると見なしたいと考えています(ロケールはもちろん、テーブルの各行ごとに固定されています)。また、テーブルは非常に長くなる可能性がありますので、列のニーズとインデックスはアプリケーション側で必要な照合順序に後処理することはできません(重労働を行うデータベースタスクです)。同じMariaDB列の複数の照合?

たとえば、utf8_general_ciは、utf8_swedish_ciとは異なる結果を生成します。

私はこの問題がどの国際的なプロジェクトでも明白であるはずですが、そこには適切な解決策が見つかりません。マイセルフ私は素敵ではないと私はより良い何も疑うだけで、次のソリューションは、行うことができる画像化することができます

  1. たぶん、ビューは文化ごとに作成してインデックスを作成することができ、各照合のために別々のフィールドを使用しますそれに応じて(私もMariaDBの景色を眺めながら働いていないので、これは非常に理論的である)
  2. 唯一のソート可能な文字列があった場合、今

多分VIRTUAL、ちょうど照合のために別々の「代理」フィールドを使用し、しかしいくつかあるかもしれません。これを解決するための意図した正しい方法は何ですか?私のテストで

SELECT * FROM sometable ORDER BY somecolumn COLLATE utf8_swedish_ci 

を、これは別の生成:限り、あなたは、列ストレージ用としてだけでなく、読んで同じ文字セット(お使いの場合はUTF8)を使用して、あなたがORDER BY column-name句の後COLLATE some-utf8-collationを使用することができます

答えて

1

ドイツの照合よりも並べ替え:

SELECT * FROM sometable ORDER BY somecolumn COLLATE utf8_german2_ci 

まあ、データに関連する文字が含まれている限りドイツ語ウムラウトüöä。そうでない場合、違いは見られません。

SELECT * FROM sometable 
ORDER BY 
    somecolumn COLLATE utf8_german2_ci, 
    secondcolumn COLLATE utf8_german2_ci 
+0

これは「小さい」テーブルの罰金です:ORDER句の

複数の列は、それぞれが独自のCOLLATE用語を取得します。索引がすでに特定の照合順序にある​​ので、 'COLLATE'節をタックすると、' INDEX'の使用が阻止されます。 –

+0

ああ、そうだよ。 'COLLATE'節で別の照合を使うときに' EXPLAIN'は "filesortを使ってインデックスを使う"と言っています。その場合、必要な照合順序で関連する列を複製する方法を見つけ出す必要があります。一方、データを移入する際の労力を最小限に抑えます。仮想列は、永続的な列である 'INDEX'を得ることができないので、ここでは役に立ちませんが、' EXPLAIN'は常に 'SELECT'でファイル分割を使用すると言います。したがって、必要な照合順序で手動で列を追加することになります。うーん、かなり悪い。 – Anse

+0

ファイルルートは、さまざまな理由で発生します。特定のクエリとそれを議論する 'CREATE TABLE'を見てみましょう。 –

関連する問題