질문인가요?
'공동지수'를 만들어야 하는 이유는 무엇인가요? 가장 실용적인 이점은 무엇입니까? 데이터를 더 빨리 질의하려면 단일 컬럼 인덱스도 괜찮지 않을까요? '공동지수'는 왜 존재하는가?
간단히 말하면 크게 두 가지 이유가 있습니다.
"하나는 3의 가치가 있다". (a, b, c)의 복합 인덱스를 구축하는 경우 실제로는 세 개의 인덱스 (a), (a, b), (a, b, c)를 구축하는 것과 동일합니다. 각 추가 인덱스가 쓰기 작업을 증가시키기 때문입니다. 오버헤드 및 디스크 공간 오버헤드. 많은 양의 데이터가 포함된 테이블의 경우 이는 많은 오버헤드입니다!
커버링 지수. 다음 SQL이 있는 경우 동일한 복합 인덱스(a, b, c)가 있습니다. a=1이고 b = 1인 테이블에서 a, b, c를 선택합니다. 그러면 MySQL은 테이블을 반환하지 않고 인덱스를 순회하여 직접 데이터를 얻을 수 있으므로 무작위 IO 작업이 많이 줄어듭니다. IO 작업, 특히 무작위 IO를 줄이는 것이 실제로 DBA의 주요 최적화 전략입니다. 따라서 실제 실제 응용에서 인덱스를 커버하는 것은 성능을 향상시키기 위한 주요 최적화 방법 중 하나입니다
인덱스 열이 많을수록 인덱스를 통해 필터링되는 데이터의 양은 줄어듭니다. 천만 개의 데이터가 있는 테이블에는 다음과 같은 SQL이 있습니다. a = 1, b =2, c = 3인 테이블에서 를 선택합니다. a만 있는 경우 각 조건이 데이터의 10%를 필터링할 수 있다고 가정합니다. 단일 값 인덱스를 사용하면 이 인덱스를 통해 1000W10%=100w개의 데이터를 필터링할 수 있으며, 테이블을 반환하여 100w개의 데이터에서 b=2 및 c=3과 일치하는 데이터를 찾을 수 있습니다. , 정렬 후 페이징 ; 복합 인덱스인 경우 인덱스를 통해 1000w 10% 10% *10%=1w를 필터링한 다음 정렬하고 페이지를 매깁니다. 하나가 더 효율적인가요?
다음 테이블 create table test(
a int,
b int,
c int,
);
에는 a, b, c 세 개의
유사한 작업을 select * from test where a=10, b>50, c>20
많이 수행해야 합니다
결합 쿼리 그런 다음 [a, b, c]를 포함하는 공동 인덱스와 [에 대한 별도의 인덱스를 생성해야 할 수도 있습니다. a][b][c]로는 충분하지 않습니다. (인덱스를 정렬된 목록으로 생각할 수 있습니다) (a, b, c)의 인덱스를 생성하는 것은 a, b, c를 정렬하는 것과 같습니다(정렬 규칙은
if(X.a>Y.a) return '>'; else if(X.a<Y.a) return '<'; else if(X.b>Y.b) return '>'; else if (X.b<Y.b) return '<'; else if (X.c>Y.c) return '>' else if (X.c<Y.c) return '<' esle return '==' )a로 정렬하는 것과 c로 정렬하는 것은 각각 다릅니다.
a b c의 순서도 중요하며 때로는 a c b 또는 b c a 등이 될 수 있습니다. (a,b)를 생성하면 c)의 공동 인덱스에 대한 질의 효율성은
优: select * from test where a=10 and b>50 差: select * from test where a>50 优: select * from test order by a 差: select * from test order by b 差: select * from test order by c 优: select * from test where a=10 order by a 优: select * from test where a=10 order by b 差: select * from test where a=10 order by c 优: select * from test where a>10 order by a 差: select * from test where a>10 order by b 差: select * from test where a>10 order by c 优: select * from test where a=10 and b=10 order by a 优: select * from test where a=10 and b=10 order by b 优: select * from test where a=10 and b=10 order by c 优: select * from test where a=10 and b=10 order by a 优: select * from test where a=10 and b>10 order by b 差: select * from test where a=10 and b>10 order by c
다음을 그래픽으로 표현한 것이다
Three Notes
mysql> explain select * from zz_deals where qq_shop_id = 64230 and product_id = '38605906667' ;+----+-------------+-------------+------+------------------------------+------------------------------+---------+-------------+------+-------------+| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |+----+-------------+-------------+------+------------------------------+------------------------------+---------+-------------+------+-------------+| 1 | SIMPLE | zz_deals | ref | by_product_id_and_qq_shop_id | by_product_id_and_qq_shop_id | 156 | const,const | 1 | Using where |+----+-------------+-------------+------+------------------------------+------------------------------+---------+-------------+------+-------------+1 row in set (0.00 sec) mysql> explain select * from zz_deals where qq_shop_id = 64230 and product_id = 38605906667 ;+----+-------------+-------------+------+------------------------------+------+---------+------+------+-------------+| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |+----+-------------+-------------+------+------------------------------+------+---------+------+------+-------------+| 1 | SIMPLE | zz_deals | ALL | by_product_id_and_qq_shop_id | NULL | NULL | NULL | 17 | Using where |+----+-------------+-------------+------+------------------------------+------+---------+------+------+-------------+1 row in set (0.00 sec)
le1024는 1~3문단을 추천합니다. 매일매일 흥미롭고 사랑스럽고 재미있는 이야기가 담긴 영상
일과 공부, 삶에 작은 행복을 더해보세요. 관련 추천사항】
1. 무료 mysql 온라인 동영상 튜토리얼
2.
MySQL 최신 매뉴얼 튜토리얼위 내용은 mysql Union Index의 장점은 무엇입니까? 공동 지수의 의미의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!