質問

Iは、単一の一意のVARCHAR(512)フィールドを持つテーブルを持っています。私は別のテーブルには、この最初のテーブルへの外部キー参照を保持したいです。両方のテーブルはInnoDBのを使用しています。 私は2番目のテーブルにVARCHAR(512)キーを追加し、その上に外部キー制約を追加する場合は512バイト長のデータが2回開催されるのですか?

その場合は、

、インデックスにはないvarchar型自体への参照のみを保持する方法はありますか?

要するに、私の質問は、InnoDB内で長いVARCHARフィールドに外部キーを保持するための効率的な方法はありますか?

タグ、ありがとうございました

Yaniv

役に立ちましたか?

解決

あなたが参照しているテーブルの上にVARCHAR(512)列を持っている場合は、

はい、データは二回存在します。

私は、あなたが参照しているテーブルの外部キーは、最初のテーブルの整数の主キーではなく、512バイトのデータを参照させることをお勧めします。これは、正規化がすべてに約あるものの一種である。

他のヒント

1~2列、およびID(INT)とデータ(VARCHAR [120])、外部キーと最後としてIDを使用する別のテーブルとデータそのものを保持するために、3つのテーブルを作成します。

私は簡単なテストを実行しました外部キーとしてデータを使用しています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を持つことの問題を回避することができます。このチェックサムフィールドは、ハッシュアルゴリズムのCRC32()以上の列の多分MD5()の出力が含まれます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top