11

通常のintよりもmysqlテーブルでsmallintデータ型を使用すると、実際にメモリ使用量が改善されますか? いずれにせよ、ハードウェアはすべてのデータに完全な 64 ビット ワード サイズを割り当てるのではないでしょうか? 完全な単語を割り当てない場合、メモリに割り当てられた 64 ビットの単語から複数の smallint または tinyint を解析する必要があるため、パフォーマンスが低下することはありませんか?

Status基本的に、列に格納されている値の範囲が smallint の最大/最小範囲を決して超えないことがわかっていると仮定すると、次の表を次の表よりも使用する設計/メモリ/パフォーマンス上の利点はありますか? 洞察をいただければ幸いです。

create table `TestTableWithSmallInt` (
  `ID` bigint(20) NOT NULL AUTO_INCREMENT,
  `Status` smallint(11) DEFAULT 0,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

create table `TestTableWithInt` (
  `ID` bigint(20) NOT NULL AUTO_INCREMENT,
  `Status` int(11) DEFAULT 0,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
4

2 に答える 2

9

理論的には、行ごとに 2 バイトを節約できます。aSMALLINTは 16 ビット符号付き整数で、INTこれは 32 ビット符号付きです。さまざまなタイプには、さまざまなストレージ要件があります。

通常、 と の間の節約はパフォーマンスのわずかな向上INTをもたらすSMALLINTため、特にこの方法でトリミングするフィールドの数が少ない場合は、それを測定するのに苦労します。

反対に、フラグ付きフィールドBIGINTの数値スペースを使い果たす可能性があると考えられる場合にのみ、 a を使用する必要があります。AUTO_INCREMENT

最適に適合させるには、長さを指定せずにそのままの型で宣言する必要があります。16ビット値からそれほどの精度を得ることは不可能であるため、誤解を招く可能性がありINTますINT(11)SMALLINT(11)

于 2013-09-26T21:08:10.383 に答える
1

コンパクト メモリ ブロックのデータ シャベルが高速になります。プログラミング言語が登場したときにのみ、変換が行われます。

于 2013-09-26T21:07:35.497 に答える