2009-03-12 3 views
3

MySQL이 인덱스를 생성 할 때 계정에 데이터 정렬을 사용하는지, 또는 데이터 정렬에 관계없이 인덱스가 동일하게 생성되는지 궁금합니다. 데이터 정렬은 나중에 해당 인덱스를 트래버스 할 때만 고려됩니다.MySQL은 인덱스와 어떻게 데이터 정렬을 사용합니까?

필자는 필드에 데이터 정렬 utf8_unicode_ci를 사용하고 싶습니다. 이 특정 데이터 정렬은 상대적으로 높은 성능 패널티가 있지만 데이터를 사용하는 것은 여전히 ​​중요합니다.

필자는 해당 필드에 ORDER BY 절을 만족시키기 위해 인덱스를 사용하여 파일 순서를 사용하지 않고 순서대로 빠르게 검색합니다. 그러나이 데이터 정렬을 사용하면 인덱스에서 다시 읽혀지는 행의 속도에 영향을 주는지 또는 인덱스가 해당 데이터 정렬에 따라 이미 정규화 된 상태로 데이터를 저장하고 성능 저하를 허용하는지 여부는 확실하지 않습니다. 전적으로 색인을 생성하고 그것을 다시 읽지 않습니다.

+0

어떤 작업에 인덱스를 사용하고 있습니까? 주문? 단일 키 조회? 범위 조회? –

+0

ORDER BY에 인덱스가 사용되고 있습니다. 감사합니다 – thomasrutter

답변

3

필자는 btree 구조가 다를 것이라고 생각합니다. 왜냐하면 열 값을 다르게 비교해야하기 때문입니다. 이 두 쿼리 계획에서

봐 :

mysql> explain select * from sometable where keycol = '3'; 
+----+-------------+-------+------+---------------+---------+---------+-------+------+--------------------------+ 
| id | select_type | table | type | possible_keys | key  | key_len | ref | rows | Extra     | 
+----+-------------+-------+------+---------------+---------+---------+-------+------+--------------------------+ 
| 1 | SIMPLE  | pro | ref | PRIMARY  | PRIMARY | 66  | const | 34 | Using where; Using index | 
+----+-------------+-------+------+---------------+---------+---------+-------+------+--------------------------+ 


mysql> explain select * from sometable where binary keycol = '3'; 
+----+-------------+-------+-------+---------------+---------+---------+------+-------+--------------------------+ 
| id | select_type | table | type | possible_keys | key  | key_len | ref | rows | Extra     | 
+----+-------------+-------+-------+---------------+---------+---------+------+-------+--------------------------+ 
| 1 | SIMPLE  | pro | index | NULL   | PRIMARY | 132  | NULL | 14417 | Using where; Using index | 
+----+-------------+-------+-------+---------------+---------+---------+------+-------+--------------------------+ 

우리가 비교를 위해 데이터 정렬을 변경하는 경우, 갑자기 심지어 더 이상 색인을 추구 할 수없는 모든 행을 검색 할 수 있습니다. 대/소문자를 구분하지 않거나 대/소문자를 구분하지 않는 데이터 정렬 여부에 관계없이 원래의 대소 문자로 값을 반환하기 때문에 인덱스에 저장된 실제 값은 데이터 정렬에 관계없이 동일합니다.

그래서 대소 문자를 구분하지 않는 대조에 대한 조회는 약간 덜 효율적이어야합니다.

그러나 나는 그 차이를 눈치 채실 수 있을지 의심 스럽습니다. MySQL은 기본적으로 모든 것을 대소 문자를 구분하지 않으므로, 그 영향은 끔찍할 수는 없다.

UPDATE : 당신은 조작에 의해 주문 유사한 효과를 볼 수 있습니다

:

mysql> explain select * from sometable order by keycol collate latin1_general_cs; 
+----+-------------+-------+-------+---------------+---------+---------+------+-------+-----------------------------+ 
| id | select_type | table | type | possible_keys | key  | key_len | ref | rows | Extra      | 
+----+-------------+-------+-------+---------------+---------+---------+------+-------+-----------------------------+ 
| 1 | SIMPLE  | pro | index | NULL   | PRIMARY | 132  | NULL | 14417 | Using index; Using filesort | 
+----+-------------+-------+-------+---------------+---------+---------+------+-------+-----------------------------+ 

mysql> explain select * from sometable order by keycol ; 
+----+-------------+-------+-------+---------------+---------+---------+------+-------+-------------+ 
| id | select_type | table | type | possible_keys | key  | key_len | ref | rows | Extra  | 
+----+-------------+-------+-------+---------------+---------+---------+------+-------+-------------+ 
| 1 | SIMPLE  | pro | index | NULL   | PRIMARY | 132  | NULL | 14417 | Using index | 
+----+-------------+-------+-------+---------------+---------+---------+------+-------+-------------+ 

참고 쿼리를 실행하는 데 필요한 단계 'filesort'추가. 즉, mysql은 임시 버퍼에 결과를 대기열에 넣고 여분의 단계에서 quicksort를 사용하여 정렬합니다. 즉, 인덱스 순서가 무엇이든간에이를 버립니다. 원래의 데이터 정렬을 사용하면 mysql이 처음 인덱스의 순서를 알기 때문에이 단계는 필요 없습니다.

+0

감사합니다. 올바르게 이해하면 실제 값이 보존되어 있어도 b-tree의 항목 순서가 데이터 정렬의 영향을받습니다. 따라서 해당 데이터 정렬을 사용할 때 ORDER BY는 여전히 효율적일 수 있습니다. 내가 잘못 이해했는지 알려 줘. – thomasrutter

+0

나는 그것이 옳다 고 생각한다. –

+0

아, 'filesort 사용'은 내가 알아야 할 것을 알려줍니다. 해당 열의 대/소문자를 구분하지 않습니다. 나는이 시점에서 나 자신을 테스트해야한다고 생각한다 ... – thomasrutter

4

MySQL은 인덱스에 대해 열의 데이터 정렬을 사용합니다. 따라서 utf8_unicode_ci 필드를 만들면 인덱스도 효과적으로 utf8_unicode_ci 순서가됩니다.

인덱스를 사용하는 것이 성능에 미치는 영향을 항상 100 % 우회하는 것은 아니지만 대부분의 실제적인 목적을 위해 사용됩니다.

많은 데이터베이스 시스템이 CPU에 바인딩되어 있지 않으므로 그 영향을 눈치 채지 못할 것입니다.

+0

대답 주셔서 감사합니다. – thomasrutter

+0

여러분이 컬럼 정렬을 바꾸고 싶다면 인덱스를 다시 만들어야한다고 생각합니다. –