私は恥知らずに 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バイトになると思います。
しかし、_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エンジンがそれらをまったく同じように格納しているという奇妙な感覚があります。それは私には驚くほど愚かなようです...
Ndbclusterが行のレイアウトにどのように影響するかについての説明に出くわしたことはないと思います。 (しかし、私は一生懸命調べていません。ソースコードも読んでいません。)しかし、たとえば、innodbテーブルには十分に文書化された行レイアウトがあります。 ( Innodb行構造 。)行の全長に影響を与えるものはかなりたくさんあります。