같은 열에 독특하고 일반적인 색인을 갖는 것이 얼마나 잘못입니까?

StackOverflow https://stackoverflow.com/questions/292230

  •  08-07-2019
  •  | 
  •  

문제

다음 테이블 구조가 있습니다

CREATE TABLE `table` (
  `id` int(11) NOT NULL auto_increment,
  `date_expired` datetime NOT NULL,
  `user_id` int(11) NOT NULL,
  `foreign_id` int(11) NOT NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `date_expired` (`date_expired`,`user_id`,`foreign_id`),
  KEY `user_id` (`user_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

알다시피, user_id에 중복 인덱스가 있습니다. date_expired & user_id. 물론 데이터가 고유한지 확인하기 때문에 고유 한 색인을 원합니다.

중복 인덱스의 이유는 user_id 색인, 내 주요 검색 쿼리는 4 초가 걸립니다. 여분의 색인은 1 초가 걸립니다. 쿼리가 테이블에 합류하고 있습니다 user_id 그리고 확인 date_expired.

테이블에는 275 개의 레코드 만 있습니다.

  • 같은 필드에서 독특하고 일반적인 색인을 갖는 것이 얼마나 나쁜가요?
  • 테이블이 순전히 ID 일 때 데이터보다 더 큰 인덱스를 갖는 것이 얼마나 나쁜가요?
도움이 되었습니까?

해결책

당신이 당신의 고유 한 지수를 다음과 같이 만들었다 고 생각합니다.user_id, date_expired, foreign_id), 당신은 정상 색인을 갖는 것과 동일한 이점을 얻을 수 있습니다. user_id 고유 한 색인만으로. MySQL은 인덱스의 첫 번째 열을 사용하여 인덱스와 동일한 방식으로 조인의 행 수를 줄일 수 있습니다. user_id.

보다 MySQL의 색인 문서 자세한 내용은.

당신은 id 공간을 절약하기 위해 스키마의 다른 곳에서 auto_increment 열? 고유 한 인덱스는 테이블의 다른 모든 열을 다루기 때문에 본질적으로 기본 키 자체이며 그렇지 않은 경우 삭제할 수 있습니다.

설명과 함께 접두사를 통해 쿼리가 사용하는 키를 확인할 수 있습니다.

다른 팁

중복 인덱스가 무엇을 의미하는지 이해하지 못합니다. 테이블에 세 가지 인덱스가 있습니다.

  1. 기본 키 'ID'를위한 하나 (고유 한 것을 암시)
  2. 'date_expired', 'user_id'및 'outrose_id'의 조합에 대한 또 다른 독특한 것
  3. 그리고 세 번째는 'user_id'만 있습니다

따라서 중복이없고 3 개가 있습니다 다른 다른 일을 할 인덱스. 사용자가보고있는 user_id와 관련된 쿼리 속도를 높이려면 3 번이 필요합니다. 따라서이 특정 테이블에는 아무런 문제가 없습니다. 아무것도 복제하지 않습니다. 두 번째 질문과 관련하여, 그것은 당신의 요구에 달려 있지만 확실히 아닙니다. 나쁜 더 많은 공간이 데이터보다 인덱스에 사용되었습니다.

예를 들어, 나쁜 것은 고유 한 ( 'user_id')와 나중에 키 ( 'user_id')를 갖는 것입니다 (MySQL이 허용하는지 확실하지 않습니다). 얻기 위해.

하나의 필드를 포함하여 몇 가지 인덱스를 갖는 것은 전혀 나쁘지 않습니다 (본질적으로는 다른 것을 색인합니다). 그것은 글쓰기 성능에 약간의 영향을 미치지 만, 그것은 당신이 모든 지수를 처음에 가지고있는 일반적인 트레이드 오프입니다. 공간이 싸면 데이터 자체보다 더 많은 공간을 섭취하는 인덱스가 나쁘지 않습니다. 귀하의 경우에는 실제로 적은 양의 항목이 있다는 사실을 감안할 때 저렴해야합니다.

내가 당신의 위치에서 묻는 질문은 다음과 같습니다. 그러한 작은 테이블의 인덱싱이 내 쿼리 런타임에 어떤 영향을 미칩니 까? 아마도 당신은 뭔가 잘못하고있을 것입니다 (이 테이블에 대한 중복 쿼리가 많이 생각합니다).이 시간 범위는 적은 수의 항목으로이 시간 범위가 없어야합니다).

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