1

これについて一般的な質問があります。の前に大量のデータが挿入されている場合、フィールドや照合のデータ型を変更したいことがよくあります。これらの状況を考慮してください:

  1. varchar照合をからに変換utf8_general_ciするlatin1_swedish_ci:最初の文字にはマルチバイト文字があり、2番目の文字は1バイト文字です。この変換は、保存されたレコードを正しく操作しますか?そして、この変換は既存のデータの量の削減(おそらく50%)につながりますか?

  2. の変換:データの量は正しく50%に減少int(10)smallint(5)ますか?

  3. または 例:int(10)to unsigned int(10)--to --to text、..。varchar(1000)varchar(20)char(10)

明らかなように、これらのアクションは、効率を高め、データの量を減らし、...

1,000,000レコードのテーブルがあるとします。このようなアクションを実行すると、保存されているデータに悪影響が及ぶかどうか、またはこのテーブルを含む将来の挿入と選択のパフォーマンスが低下するかどうかを知りたいです。

更新:
utf8エンコーディング文字セットをラテン語に変更することについて話すとき、もちろん私のフィールドの値は英語です(日本語がある場合、それらは失われることは明らかです)。この仮定で、結果のテーブルサイズとパフォーマンスについて質問しています。

4

3 に答える 3

4
  1. varchar照合をからに変換utf8_general_ciするlatin1_swedish_ci:私が知っているように、最初の文字にはマルチバイト文字があり、2番目の文字は1バイト文字です。この変換は、保存されたレコードを正しく操作しますか?そして、この変換は既存のデータの量の削減(おそらく50%)につながりますか?

    照合は、文字列の比較に使用される順序にすぎません。データの保存に使用される文字エンコードとは(ほとんど)関係ありません。照合は特定の文字セットでのみ使用できるため、照合を変更すると文字エンコードが強制的に変更される可能性があるためです。

    文字エンコードが変更される限り、MySQLは、シングルバイトからマルチバイトに、またはその逆に、新しい文字セットに値を正しく再エンコードします。列に対して大きくなりすぎる値は切り捨てられることに注意してください。

    新しい文字タイプが可変長であり、値が以前よりも少ないバイト数でエンコードされている場合、当然、テーブルのサイズは小さくなります。

  2. の変換:データの量は正しく50%に減少int(10)smallint(5)ますか?

    INTSMALLINTは、表示幅に関係なく、それぞれ4バイトと2バイトを占有します。したがって、そうです、テーブルのサイズはそれに応じて小さくなります。

  3. または例:int(10)to unsigned int(10)--to --to text、..。varchar(1000)varchar(20)char(10)

    • INT署名されているかどうかに関係なく4バイトを占めるため、変更はありません。

    • TEXT両方ともL +2バイト(LVARCHAR(1000)はバイト単位の値の長さ)を占めるため、変更はありません。

    • VARCHAR(20)L +1バイト(Lはバイト単位の値の長さ)を占有し、10×wバイト(wは文字セットの最大長文字に必要なバイト数)をCHAR(10)占有するため変更がある可能性がありますが、保存されている実際の値と使用されている文字エンコードによって異なります。

ストレージエンジンによっては、テーブルサイズの縮小がファイルシステムにすぐにリリースされない場合があることに注意してください。

于 2012-12-19T10:34:01.973 に答える
1

A1。照合によってデータが変更されることはありません。クエリの並べ替え順序が変更され、場合によってはインデックス(?)が変更されます。

A2。列のデータの長さは短くなりますが、テーブル行ごとに常にある程度のオーバーヘッドがあり、それを変更することはできません。さらに、データが一意でない場合、インデックスは次のようになります。33-> {row1、row2、row3 ...}、67-> {row9、row0、row7}そして、すべての行ポインタはintよりもはるかに大きいです。

つまり、多くのインデックスがなく、100 int行のテーブルがあり、これらすべての列をtinyintに変更した場合、顕著な改善が見られます。1列しかない場合は、気にしないでください。

http://dev.mysql.com/doc/refman/5.0/en/storage-requirements.html http://dev.mysql.com/doc/refman/5.0/en/innodb-physical-record.html

A3。テキストとvarcharを読んでください。前者はテーブル行とは別にデータを格納し、後者は行に格納します。それぞれに独自の意味があります。

ps行とインデックスのオーバーヘッドは、使用するdbエンジンに大きく依存します。通常はinnodbを使用する必要があります。ただし、データマイニングなどの読み取り専用タスクの場合、myisamの方が効率的です。

于 2012-12-19T10:36:43.400 に答える
0
  • varchar照合をからに変換utf8_general_ciするlatin1_swedish_ci:テーブル(ファイル)のサイズを減らすことができますが、ラテン語の記号を失うことはなく、英語の単語のみが正しく保存されます。
  • に変換int(10)するsmallint(5)と、データの量が減ります。に変換-それは減少しませんint(10)unsigned int(10)このような場合、値に注意する必要があります。範囲外の値というエラーが発生する可能性があります。
  • 変換varchar(20)char(10):CHARは、常に同じ長さ(たとえば、-10)の文字列に使用されます。文字列の長さが異なる場合は、VARCHARデータ型を使用します。
于 2012-12-19T10:44:59.707 に答える