외국 키로 바르 르 차만있는 mysql 테이블
-
18-09-2019 - |
문제
나는 단일 독특한 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()
더 큰 열의.