2つの列とID(int)とデータ(varchar [120])でデータ自体を保持する3つのテーブルを作成し、そのIDを外部キーとして使用する別のテーブルと、外部キーとしてデータを使用して、最後の1:
CREATE TABLE `dados` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(120) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`) USING BTREE,
KEY `idx` (`id`,`name`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
CREATE TABLE `refINT` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`dado` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `id` (`dado`),
CONSTRAINT `id` FOREIGN KEY (`dado`) REFERENCES `dados` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
CREATE TABLE `refSTR` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`dado` varchar(120) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`),
KEY `nome` (`dado`),
CONSTRAINT `nome` FOREIGN KEY (`dado`) REFERENCES `dados` (`name`) ON DELETE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
が各テーブルに100件のレコードを挿入して、最終的なテーブルのサイズを比較した:
dados: 192.0 KB
refINT: 32.0 KB
refSTR: 32.0 KB
だから私は、データがvarchar型の外部キーに複製されていないと思い、よく、少なくともMySQL 5.1バージョンでは。
しかし、varcharのインデックスが存在するときに整数キーを追加するのは無駄ではありませんか? 私が本当に欲しいのは、インデックスの内容だけを参照する方法です。 – Yaniv
行に「ハンドル」が必要な場合は無駄ではなく、他のオプションは512文字のvarchar列のみです。 「インデックスの内容だけを参照する方法」というこの考え方は、私にとってはナンセンスのようです。索引索引の値以外は参照できません。 – chaos
すべてのデータは実際に512バイトの長さですか?ストレージは、各行のレコードのサイズに制限する必要があります。可能であれば、整数の主キーと外部キーに行く方がよいでしょう。 – Turnkey