본문 바로가기
MySql

MySQL : 쿼리에서 정렬-부작용이 있습니까?

by 베이스 공부 2020. 11. 21.
반응형

OpenCart 테이블 데이터 정렬은 utf8_bin 입니다. 불행히도 이름에 악센트가있는 제품 이름을 검색 할 수 없습니다. Google에서 검색 한 결과 악센트 호환 및 대소 문자를 구분하지 않는 검색을 위해 데이터 정렬이 utf8_general_ci 여야 함을 발견했습니다.

검색 쿼리에 데이터 정렬 선언을 추가하면 어떻게됩니까?

SELECT * 
FROM  `address` 
COLLATE utf8_general_ci
LIMIT 0 , 30

(나쁜) 부작용이 있습니까? 인덱싱, 성능 문제에 대해 빨간색? 아니면 완전히 안전합니까?

 

해결 방법

 

특히 인덱스를 사용하는 경우 쿼리 성능에 대한 부작용을 고려해야합니다. 다음은 간단한 테스트입니다.

mysql> create table aaa (a1 varchar(100) collate latin1_general_ci, tot int);
insert into aaa values('test1',3) , ('test2',4), ('test5',5);

mysql> create index aindex on aaa (a1);
Query OK, 0 rows affected (0.59 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc aaa;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| a1    | varchar(100) | YES  | MUL | NULL    |       |
| tot   | int(11)      | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+
2 rows in set (0.53 sec)


mysql> explain select * from aaa where a1='test1' ;
+----+-------------+-------+------+---------------+--------+---------+-------+--
----+-----------------------+
| id | select_type | table | type | possible_keys | key    | key_len | ref   | r
ows | Extra                 |
+----+-------------+-------+------+---------------+--------+---------+-------+--
----+-----------------------+
|  1 | SIMPLE      | aaa   | ref  | aindex        | aindex | 103     | const |
  1 | Using index condition |
+----+-------------+-------+------+---------------+--------+---------+-------+--
----+-----------------------+
1 row in set (0.13 sec)

mysql> explain select * from aaa where a1='test1' collate utf8_general_ci;
+----+-------------+-------+------+---------------+------+---------+------+-----
-+-------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows
 | Extra       |
+----+-------------+-------+------+---------------+------+---------+------+-----
-+-------------+
|  1 | SIMPLE      | aaa   | ALL  | NULL          | NULL | NULL    | NULL |    3
 | Using where |
+----+-------------+-------+------+---------------+------+---------+------+-----
-+-------------+
1 row in set (0.06 sec)

다른 데이터 정렬을 사용하여 검색 할 때 MySQL이 a1의 인덱스 사용을 중지하는 것을 볼 수 있으며 이는 큰 문제가 될 수 있습니다.

인덱스가 쿼리에 사용되고 있는지 확인하려면 열 데이터 정렬을 가장 자주 사용되는 데이터 정렬로 변경해야 할 수 있습니다.

 

참조 페이지 https://stackoverflow.com/questions/29930653

 

 

반응형

댓글