필자는 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이 처음 인덱스의 순서를 알기 때문에이 단계는 필요 없습니다.
어떤 작업에 인덱스를 사용하고 있습니까? 주문? 단일 키 조회? 범위 조회? –
ORDER BY에 인덱스가 사용되고 있습니다. 감사합니다 – thomasrutter