반응형
내 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
반응형
'MySql' 카테고리의 다른 글
MySQL Mysql 쿼리의 평균 합계 (0) | 2020.11.21 |
---|---|
MySQL 오류 mysqli :: real_connect () : (HY000 / 2002) : 라이브 서버에서 내 프로젝트에 액세스하려고 할 때 해당 파일이나 디렉토리가 없습니다. (0) | 2020.11.21 |
MySQL IN 및 하위 쿼리를 사용한 MYSQL 업데이트 (0) | 2020.11.21 |
MySQL PHP 양식을 사용하여 여러 테이블에서 데이터를 검색하는 방법은 무엇입니까? (0) | 2020.11.21 |
MySQL CodeIgniter, 모델에서 컨트롤러로 여러 쿼리를 반환하는 방법은 무엇입니까? (0) | 2020.11.21 |
댓글