슬로우 쿼리를 보다보니 function based index 를 써야되는 쿼리가 있다.

 

문제는 5.7 에서는 지원 안한다. 그럼 Virtual Columns을 쓰자.

# 테스트 테이블 생성 
mysql> create table _numbers(num int auto_increment primary key);
Query OK, 0 rows affected (0.02 sec)

# 테스트 데이터 입력 1 ~ 100000
mysql> insert into _numbers 
    -> select null 
    -> FROM information_schema.COLUMNS t1
    ->     JOIN information_schema.COLUMNS t2
    ->     JOIN information_schema.COLUMNS t3
    ->     LIMIT 100000;
Query OK, 100000 rows affected (0.92 sec)
Records: 100000  Duplicates: 0  Warnings: 0



# num 끝자리가 1인걸 검색하는 쿼리 (이런 형태의 쿼리가 날라온다.)
mysql> explain select * from _numbers where num like '%1';
+----+-------------+----------+-------+---------+---------+------+--------+----------+--------------------------+
| id | select_type | table    | type  | key     | key_len | ref  | rows   | filtered | Extra                    |
+----+-------------+----------+-------+---------+---------+------+--------+----------+--------------------------+
|  1 | SIMPLE      | _numbers | index | PRIMARY | 4       | NULL | 100575 |    11.11 | Using where; Using index |
+----+-------------+----------+-------+---------+---------+------+--------+----------+--------------------------+



# Virtual Columns 추가.. 안된다.  왜? 에러메시지를 봐라..
mysql> alter table _numbers  add num_mod int generated always as (num % 10) virtual not null;
ERROR 3109 (HY000): Generated column 'num_mod' cannot refer to auto-increment column.



# num 컬럼에 auto_increment 속성을 제거한다. 
mysql> alter table _numbers modify num int not null;
Query OK, 100000 rows affected (0.80 sec)
Records: 100000  Duplicates: 0  Warnings: 0



# Virtual Columns 추가 된다! 
mysql> alter table _numbers  add num_mod int generated always as (num % 10) virtual not null;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0



# 인덱스도 걸고
mysql> alter table _numbers add index idx__numbers_num_mod (num_mod);
Query OK, 0 rows affected (0.37 sec)
Records: 0  Duplicates: 0  Warnings: 0



# 뚜둥 실행계획 
mysql> explain select * from _numbers where num_mod= 1;
+----+-------------+----------+------+----------------------+---------+-------+-------+----------+-------------+
| id | select_type | table    | type | key                  | key_len | ref   | rows  | filtered | Extra       |
+----+-------------+----------+------+----------------------+---------+-------+-------+----------+-------------+
|  1 | SIMPLE      | _numbers | ref  | idx__numbers_num_mod | 4       | const | 10000 |   100.00 | Using index |
+----+-------------+----------+------+----------------------+---------+-------+-------+----------+-------------+
1 row in set, 1 warning (0.00 sec)

 

 

'MySQL' 카테고리의 다른 글

binlog format  (0) 2021.05.15
인덱스 최대 크기  (0) 2021.05.13
MySQL 포퍼먼스 튜닝  (0) 2021.05.12
delete .. where in () 시 결합인덱스 사용  (0) 2021.05.03
MySQL 5.6 -> 5.7 병렬복제  (0) 2021.04.27

장비교체 하면서 MySQL 5.6 -> 5.7로 업그레이드 할 일이 생겼다.

 

자~ 계획을 세워보자 

(누구나 계획은 있지...)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

5.6 복제세트에 5.7 복제세트를 붙여서 업그레이드

여기서 문제가 될만한것을 생각해보자

 

1. 5.7 부터 기본 캐릭터셋이 utf8mb4 로 바뀌었다.

   5.6 (utf8) -> 5.7 (utf8mb4) 로 복제를 걸때 다른 캐릭터셋으로 연결되면서 오류가 발생한다. 

   이를 해결하기 위해 global slave_type_conversions=ALL_NON_LOSSY 를 적용해주면 된다. 

   이부분은 캐릭터셋을 utf8mb4로  바꿀때만 적용된다. utf8을 그대로 사용할 경우 아무 문제 없다.

 

2. 5.6 (utf8) 3byte ->  5.7 (utf8mb4) 4byte 로 변경되면서 컬럼사이즈가 varcahr 로는 max 수치가 오버되는 경우가 있다. 

 

3. 5.7 에서 sql_mode에 ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES 가 기본으로 적용되었다.
   5.6 에서는 SQL 표준문법이 아니더라도 실행은 되었지만 5.7 에서는 에러가 발생하는 쿼리 확인이 필요하다.
   - ONLY_FULL_GROUP_BY : group by 하지 않은 열을 select 할 수 없다. 
   - STRICT_TRANS_TABLES : 형식이 맞지 않는 값을 insert 할때, 예전에는 warning 이 뜨고 그냥 입력되었지만 5.7부터는 에러가 발생한다.

 

자 이제 복제를 걸어보자. 

원본 DB에서 xtrabackup 을 받아서 신규 DB에 복원하고 복제를 걸면된다. (상세한 설명은 생략한다.)

 

잘된다. 싶었는데.. 문제가 생겼다. 

복제가.. 밀린다! 복제 지연 발생.

 

해결방법은.. LOGICAL_CLOCK 방식의 병렬복제 (Multi-Threaded Slave, MTS) 를 적용해 보자. (적용 방법 생략)

아!! 안된다. ㅡ_ㅡ);;;

 

slave_parallel_workers 를 4개를 잡아도 1넘만 일한다.

mysql> select Id, Master_log_name, Master_log_pos from slave_worker_info;
+----+------------------+----------------+
| Id | Master_log_name  | Master_log_pos |
+----+------------------+----------------+
|  1 | mysql-bin.000011 |     1920310192 |
|  2 |                  |              0 |
|  3 |                  |              0 |
|  4 |                  |              0 |
+----+------------------+----------------+

 

어라어라 왜? 안되지?

 

당연히 안되는거다.. 

 

slave_parallel_type을 logical_clock 으로 적용하기 위해서는 Master 에 binlog_transaction_dependency_tracking 을 적용해야 되는데 5.6 에는 이 파라미터가 없다. 

dev.mysql.com/doc/refman/5.7/en/replication-options-replica.html#sysvar_slave_parallel_type

 

어쩔수 없지 병렬복제는 포기하고 복제지연을 해결할 방법은 5.7 Master 에 적용된 log_slave_updates 옵션을 해제하고 

아래와 같이 구축하고 점검시에 5.7 서버 2대를 Master/Slave로 구성한다. 

log_slave_updates 활성시에 relay log 에 기록된 내용을 binlog 에도 저장해야되니 I/O가 2개가 되서 복제 지연이 발생할 수도 있다.

아래와 같이 구축하고 나서 복제지연은 해결되었다. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'MySQL' 카테고리의 다른 글

binlog format  (0) 2021.05.15
인덱스 최대 크기  (0) 2021.05.13
MySQL 포퍼먼스 튜닝  (0) 2021.05.12
delete .. where in () 시 결합인덱스 사용  (0) 2021.05.03
MySQL 5.7 Virtual Columns  (0) 2021.04.27

n.news.naver.com/article/215/0000930047

 

로켓배송 멈추고 복합쇼핑몰 문 닫는다

[한국경제TV 신선미 기자] <앵커> ‘온라인 쇼핑몰 배송시간에 제한이 생기고, 스타필드나 롯데몰 같은 복합쇼핑몰이 주말에 문을 닫는다.’ 생각만 해도 참 불편해지겠다 싶은데요. 이 같은 내

n.news.naver.com

무슨 생각으로 일을 벌리는건지 알겠는데.

세상 변해가는건 생각 안하는걸까? 

 

기대하던 S21 발표

예상은 했지만 생각보다 뭔가 약하다는 느낌?

디자인은 이뻐졌지만

물론 먼가 더 최적화는 되었겠지만 

S20이 더 나은듯한 느낌?

 

결국 S20 영입

빨리와라.

'일상' 카테고리의 다른 글

ITB-650HD AS  (0) 2021.05.28
외장형 비비 장착 실패  (0) 2021.05.23
자전거 스프라켓 교체  (0) 2021.05.13

2일전엔 VI 발동

그담날에 국세청 세무조사 추징금..

잼있어.. 

'주식' 카테고리의 다른 글

2020년 투자 실패  (0) 2021.01.04

2020년에 매수했던 종목중에 투자 실패한 종목

- 아톤

- 네오팜

 

아톤은 공인인증서폐지 수혜종목으로 매수하였으나 욕심이 과해 매도하지 못하였다.

손해보고 매도... 욕심이 문제다.

 

네오팜은 딸아이가 사용하던 아토팜이 생각나서 매수 하였으나 코로나 이후 회복이 안된다.

코로나 끝나고 중국쪽이 회복될때까지 답이 없어 기회비용을 고려하여 매도

 

2021년엔 욕심을 버리고 투자하자.

'주식' 카테고리의 다른 글

참 잼있네.  (0) 2021.01.14

+ Recent posts