web-dev-qa-db-ja.com

MySQLの行の長さは私が期待するもののほぼ3倍です

私は恥知らずに this の質問からタイトルとコンテンツを取得し、それを私の似ているが異なる問題に適合させました。

これは私が持っているテーブルです:

_CREATE TABLE `test` (
    `field1` MEDIUMINT(8) UNSIGNED NOT NULL,
    `field2` INT(10) UNSIGNED NOT NULL,
    `field3` SMALLINT(5) UNSIGNED NOT NULL,
    `field4` SMALLINT(5) UNSIGNED NOT NULL,
    `field5` FLOAT UNSIGNED NOT NULL DEFAULT '0',
    PRIMARY KEY (`field1`, `field2`),
    INDEX `field2` (`field2`, `field1`)
)
COLLATE='latin1_swedish_ci'
ENGINE=ndbcluster
ROW_FORMAT=DEFAULT
_

行の長さは15バイトになると思います。

  • field1の場合は3バイトmediumint(8)
  • field2の場合は4バイトint(10)
  • field3の場合は2バイトsmallint(5)
  • field4の場合は2バイトsmallint(5)
  • field5floatの場合は4バイト

しかし、_show table status;_は

_Name: test
Engine: ndbcluster
Row_format: Fixed
Rows: 143120123
Avg_row_length: 44 <--------------  (I assume this is in bytes?)
Data_length: 7659913216
_

ご覧のとおり、私にはかなりの数の行があるので、行の長さは本当に重要です。

なぜそんなにスペースがかかるのですか?

そして、なぜ_Data_length_が予想よりもはるかに大きいのですか?

_Data_length - (Rows * Avg_row_length) = 7659913216 - 6297285412 = 1362627804 = 1.26 GB
_

そして、タイプ名の後の括弧内の数字は何ですか? (例:mediumint(8))これはフィールドの文字列表現のcharの長さだと思いますが、MySQLのndbclusterエンジンがそれらをまったく同じように格納しているという奇妙な感覚があります。それは私には驚くほど愚かなようです...

1
Ben

Ndbclusterが行のレイアウトにどのように影響するかについての説明に出くわしたことはないと思います。 (しかし、私は一生懸命調べていません。ソースコードも読んでいません。)しかし、たとえば、innodbテーブルには十分に文書化された行レイアウトがあります。 ( Innodb行構造 。)行の全長に影響を与えるものはかなりたくさんあります。