InnoDB 색인 사례 작성

실례: 일반 id는 테이블의 메인 키로 unique 키가 존재하는 상황에서 인덱스 구축은 두 가지 방식이 있다.
1. primary key와 unique 병존
2,unique 키를 primary 키로 바꿉니다.
테스트:
표 uah Primary key(id), UNIQUE KEY('user id','fight xml id')

CREATE TABLE `uah`  
 `id` bigint(20) NOT NULL AUTO_INCREMENT,
 `fight_xml_id` bigint(20) NOT NULL,
 `user_id` bigint(20) NOT NULL,
 `awards` varchar(1000) NOT NULL,
 `created_at` bigint(20) NOT NULL,
 PRIMARY KEY (`id`),
 UNIQUE KEY `index_uid_xmlid` (`user_id`,`fight_xml_id`)
) ENGINE=InnoDB AUTO_INCREMENT=95097 DEFAULT CHARSET=utf8

표:comuah Primary key
   (user_id,fight_xml_id )

CREATE TABLE `com_uah` (
 `fight_xml_id` bigint(20) NOT NULL,
 `user_id` bigint(20) NOT NULL,
 `awards` varchar(1000) NOT NULL,
 `created_at` bigint(20) NOT NULL,
 PRIMARY KEY (`user_id`,`fight_xml_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

 
표에는 모두 9W 개의 기록이 포함되어 있다
select 쿼리 테스트:
표 uah

explain select  awards from uah where user_id=80204 and fight_xml_id=42104\G
*************************** 1. row ***************************
 id: 1
 select_type: SIMPLE
 table: uah
 type: const
possible_keys: index_uid_xmlid
 key: index_uid_xmlid
 key_len: 16
 ref: const,const
 rows: 1
 Extra: 
1 row in set (0.00 sec)

인덱스는 unique 키, 키len=16,type=const,cache가 없는 상황에서 select는 unique 키를 통해 키를 찾은 다음 키를 통해awards 값을 찾습니다.
표comuah:
explain select awards from com_uah where user_id=80204 and fight_xml_id=42104\G
*************************** 1. row ***************************
 id: 1
 select_type: SIMPLE
 table: com_uah
 type: const
possible_keys: PRIMARY
 key: PRIMARY
 key_len: 16
 ref: const,const
 rows: 1
 Extra: 
1 row in set (0.00 sec)

메인 키를 통해 직접 찾습니다.상수 조회에 속하다.Key_len=16, 색인 2차 검색이 없습니다.
두 테이블의 기본 정보:

show table status like 'uah'\G
*************************** 1. row ***************************
 Name: uah
 Engine: InnoDB
 Version: 10
 Row_format: Compact
 Rows: 94803
 Avg_row_length: 160
 Data_length: 15220736
Max_data_length: 0
 Index_length: 4734976
 Data_free: 24117248
 Auto_increment: 95097
 Create_time: 2012-10-31 14:58:53
 Update_time: NULL
 Check_time: NULL
 Collation: utf8_general_ci
 Checksum: NULL
 Create_options:
 Comment: 
1 row in set (0.00 sec)
 
mysql> show table status like 'com_uah'\G
*************************** 1. row ***************************
 Name: com_uah
 Engine: InnoDB
 Version: 10
 Row_format: Compact
 Rows: 88328
 Avg_row_length: 172
 Data_length: 15253504
Max_data_length: 0
 Index_length: 0
 Data_free: 24117248
 Auto_increment: NULL
 Create_time: 2012-10-31 15:03:16
 Update_time: NULL
 Check_time: NULL
 Collation: utf8_general_ci
 Checksum: NULL
 Create_options:
 Comment: 
1 row in set (0.00 sec)

두 개의 시계가 데이터length  com_uah > uah
    Avg_row_length :
      com_uah > uah
그 이유는comuah표의 메인 키는 id보다 훨씬 크다.하면, 만약, 만약...aah가 2단계 인덱스를 포함하면primary 키,comuah가 더 커질 거야.
게임 업계에 있어서 빈번한 업데이트, insert, delete는 더 많은 파편을 초래하여 더 많은 무작위 IO를 초래할 수 있다.
종합: id를 메인 키로 하는 것이 적당하다
하면, 만약, 만약...uah 중user아이디 프라이머리 키 할까요?
업무가 허용된 경우 uid는primary 키로 할 수 있으며 2단계 인덱스를 포함하는 경우도 마찬가지다.(일률적으로 논할 수 없고 구체적인 상황을 구체적으로 분석할 수 없지만 이 사례 업무는 허용되지 않는다.)

좋은 웹페이지 즐겨찾기