2009-08-10 51 views
0

私は、列の1つがテーブルからいくつかの行をグループ化するために使用される一種のID文字列であるテーブルを持っています。列名が「マップ」で、マップの値の1つがたとえば"ウォルマート"。列にはインデックスがあります。なぜなら、特定のマップに属する行をフィルタリングするためです。MYSQLは、同じ文字列が複数の行に格納されている場合に最適な方法で格納しますか?

私はそのようなマップをたくさん持っており、異なるマップ値がテーブルからどれくらいのスペースを占めるか分かりません。 MYSQLは複数の行に同じマップ値が格納されていることを認識し、内部で一度だけ格納し、内部数値IDで参照するだけですか?

または、マップ文字列を明示的に数値IDで置き換え、テーブルのサイズを小さくしたい場合は、マップ文字列とIDをペアにするために別のテーブルを使用する必要がありますか?

答えて

4

MySQLは、データが既に別の行に存在するかどうかにかかわらず、すべての行のデータ全体を保存します。

オプションが限られている場合は、ENUMフィールドを使用できます。そうしないと、名前を別のテーブルにプルして結合することができます。

+0

奇妙なMYSQLはできません。列にインデックスがあるため、値が複数回使用されているかどうかを知ることができます。私はオプションを調べます。 –

0

私は、毎回あなたのコンテンツを複製すると思います。それは明示的に指定しない限り(データを別のテーブルに入れておきます)、行ごとにデータを格納します。 (小に比べて、あなたのデータのサイズについて少し考えたいかもしれません(彼らは大きなですか?)、:

別のテーブルを使用すると、あなたのクエリの一部に参加を追加する必要がありますを意味します?)その結合のために発生する可能性のあるパフォーマンスの低下。

もう一つの解決策は、少なくともあなたがあなたのテーブルにある文字列を事前に知っていればENUMデータ型を使用することです。

最後に、文字列に対応する整数「コード」を格納し、それらのコードをアプリケーションによって文字列に変換することもできます(データベースを完全に外しても構いませんが、 SQLクエリで結合を使用するのではなく、アプリケーションによってキャッシュされたテーブル)。
これは「クリーン」ではありませんが、パフォーマンスには良いかもしれませんが、これはあなたのケースでは必要ないマイクロ最適化のようなものかもしれません...

0

値が何度も何度も繰り返されている場合、ディスクスペースの考慮事項とは別に、それを別のテーブルに移動するための良い機能上の理由があります。

StoreNameの列を含むStoresテーブルがあるとします。 StoreNameの値の中で "WalMart"は300回発生し、 "BalMart"があります。それは単に "WalMart"のタイプミスですか、それとも別の店ですか?

チェーンにまたがって一定のストアに関連付けられている他のデータがある場合は、そのストアを繰り返し保存しないでください。

もちろん地図上の場所を表示していて、本当に気にしない場合は表示するだけの名前ですが、これはまったく関係ありません。

それがそうであれば、大容量のディスクを購入するほうがおそらく、レコードごとに数バイトを節約するためにデータベースを再設計するより簡単な解決策です。ここで場所名のために任意の文字列を話していると、重複を見つけてルックアップを作成しようとすると、おそらくほとんど利益が得られないでしょう。

関連する問題