4

単一の一意のVARCHAR(512)フィールドを持つテーブルがあります。この最初のテーブルへの外部キー参照を別のテーブルに保持させたい。どちらのテーブルもInnoDBを使用しています。2番目のテーブルにVARCHAR(512)キーを追加し、それに外部キー制約を追加すると、512バイトの長さのデータが2回保持されますか?

もしそうなら、varchar自体ではなく、インデックスへの参照のみを保持する方法はありますか?

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

どうもありがとうございます、

ヤニフ

4

3 に答える 3

3

簡単なテストを実行しました。3つのテーブルを作成します。1つは2つの列を持つデータ自体を保持し、ID(int)とデータ(varchar [120])、もう1つはIDを外部キーとして使用し、最後のテーブルは外部キーとしてのデータ:

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

したがって、少なくともMySQL 5.1バージョンでは、データはvarchar外部キーで複製されないと思います。

于 2011-04-23T22:42:25.017 に答える
2

はい、VARCHAR(512)参照テーブルに列がある場合、データは2回存在します。

参照テーブルの外部キーが、512バイトのデータではなく、最初のテーブルの整数主キーを参照するようにすることをお勧めします。これが正規化の一種です。

于 2009-08-16T21:50:35.380 に答える
0

キーサイズを小さく保つことは常に良いことです。VARCHAR挿入時に生成する追加のチェックサム列を使用する代わりに、大きなインデックスを作成するという問題を回避できます。このチェックサムフィールドには、ハッシュアルゴリズムの出力、CRC32()またはMD5()より大きな列の出力が含まれます。

于 2011-04-23T22:47:47.087 に答える