문제

나는 단일 독특한 Varchar (512) 필드가있는 테이블이 있습니다. 다른 테이블 에이 첫 번째 테이블에 대한 외국 키 참조를 보유하고 싶습니다. 두 테이블 모두 innodb를 사용합니다. 두 번째 테이블에 Varchar (512) 키를 추가하고 512 바이트 긴 데이터가 두 번 유지됩니까?

그렇다면 바르 차르 자체가 아닌 색인에 대한 참조 만 보유 할 수있는 방법이 있습니까?

요컨대, 내 질문은 innodb에서 긴 바르 르 차 필드에 대한 외국 열쇠를 유지하는 효율적인 방법이 있습니까?

매우 감사합니다,

야니 니프

도움이 되었습니까?

해결책

예, 당신이있는 경우 VARCHAR(512) 참조 테이블의 열에는 데이터가 두 번 존재합니다.

참조 테이블의 외국 키를 512 바이트 데이터가 아닌 첫 번째 테이블의 정수 기본 키를 참조하는 것이 좋습니다. 이것은 정규화의 일종입니다.

다른 팁

간단한 테스트를 실행했습니다. 하나는 두 개의 열로 데이터 자체를 보유하는 3 개의 테이블을 만들고 ID (int) 및 데이터 (Varchar [120]), 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

따라서 데이터가 Varchar Foreign 키에서는 복제되지 않았다고 생각합니다.

키 크기를 작게 유지하는 것은 항상 좋습니다. 당신은 큰 문제를 해결할 수 있습니다 VARCHAR 대신 삽입 시간에 생성하는 추가 체크섬 열을 사용하여 색인화되었습니다. 이 체크섬 필드에는 해싱 알고리즘의 출력이 포함됩니다. CRC32() 아니면 어쩌면 MD5() 더 큰 열의.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top