DHistory

[Real MySQL 8.0] 11-3 MySQL 연산자와 내장 함수 (2) 본문

Infrastructure/MySQL

[Real MySQL 8.0] 11-3 MySQL 연산자와 내장 함수 (2)

ddu0422 2023. 6. 23. 22:22

11-3-2 MySQL 연산자

Equal

= 기호를 사용하여 비교를 수행합니다.

<=> 연산자는 = 연산자와 비슷하지만 NULL 값에 대한 비교까지 수행합니다.

 

Not Equal

결과를 반대로 만드는 연산자로 NOT을 사용합니다.

! 연산자를 사용할 수도 있습니다.

 

REGEXP

문자열 값이 어떤 패턴을 만족하는지 확인하는 연산자입니다.

RLIKE와 동일하게 수행하는 연산자입니다.

문자열을 하나하나 분리하여 조합하기 때문에 index를 사용할 수 없습니다.

 

LIKE

REGEXP 연산자보다는 훨씬 단순한 문자열 패턴 비교 연산자입니다.

DBMS엣는 LIKE 연산자를 더 많이 사용합니다.

LIKE 연산자는 정규 표현식을 검사하는 것이 아닌 어떤 상수 문자열이 있는지 없는지 정도를 판단하는 연산자입니다.

LIKE에서 사용할 수 있는 와이드카드 문자는 %와 _입니다.

 

% 0또는 1개 이상의 모든 문자에 일치
_ 정확히 1개의 문자에 일치

 

LIKE 연산자는 와일드카드 문자가 검색어의 뒤쪽에 있다면 index range scan으로 사용할 수 있습니다.

                       와일드카드 문자가 검색어의 앞쪽에 있다면 full scan입니다.

 

where name like 'lee%' index 사용 가능
where name like '%duho' index 사용 불가 

 

100만건의 dummy data SELECT 실험입니다.

mysql> show create table users\G;
*************************** 1. row ***************************
       Table: users
Create Table: CREATE TABLE `users` (
  `name` varchar(400) DEFAULT NULL,
  `nickname` varchar(400) DEFAULT NULL,
  KEY `index_users_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

mysql> explain select * from users where name like 'leeduho%' limit 10;
+----+-------------+-------+------------+-------+------------------+------------------+---------+------+--------+----------+-----------------------+
| id | select_type | table | partitions | type  | possible_keys    | key              | key_len | ref  | rows   | filtered | Extra                 |
+----+-------------+-------+------------+-------+------------------+------------------+---------+------+--------+----------+-----------------------+
|  1 | SIMPLE      | users | NULL       | range | index_users_name | index_users_name | 403     | NULL | 498654 |   100.00 | Using index condition |
+----+-------------+-------+------------+-------+------------------+------------------+---------+------+--------+----------+-----------------------+
1 row in set, 1 warning (0.01 sec)

mysql> explain select * from users where name like '%duho%' limit 10;
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows   | filtered | Extra       |
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-------------+
|  1 | SIMPLE      | users | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 997308 |    11.11 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-------------+
1 row in set, 1 warning (0.00 sec)

mysql> explain select * from users where name like '%1' limit 10;
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows   | filtered | Extra       |
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-------------+
|  1 | SIMPLE      | users | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 997308 |    11.11 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-------------+
1 row in set, 1 warning (0.01 sec)