mysql 7

MySQL 8.0부터 추가된 explain analyze 에 대해 ARABOZA!

MySQL 8.0부터 추가된 explain analyze 에 대해 ARABOZA!MySQL에서 쿼리 인덱스랑 실제 동작 관련 테스트를 하는데... 엄청 많은 조건이 있어서 대체 어디서 시간이 오래걸리는지 이런거가 매우 헷갈렸다.이 때에 아주 유용한게 explain analyze 이다.사실 이거 보면 매우매우 잘 설명되어있기는 한데 걍 정리해본다.실제로 경험한 일인데, 상세한 내용을 말하기는 어렵고 통해 그냥 이거의 장점만 훑으려 한다.일단 기존의 explain 과 다른 점은explain은 실제로 SQL 쿼리를 실행하지 않은 상태에서 옵티마이저가 계획한 쿼리 실행 계획을 보여준다.explain analyze 는 쿼리를 실제로 실행한 뒤에 그 결과를 통해 실행 계획을 보여준다. 또, 실제로 실행하면서 각 단..

MySQL 페이징 해보자(feat offset, infinite scroll)

보통 개발할 때에 반드시 공부하고 적용하는게 페이징일 것 같다. 그리고 아마... 처음에는 offset limit을 써서 적용을 할 것 같다. 이 offset limit에 대해, 그리고 offset limit의 문제점에 대해, 해결 방안에 대해 써보려고 한다. 일단은 간단한 테스트를 위해 CREATE TABLE board ( id INT AUTO_INCREMENT PRIMARY KEY, title VARCHAR(255) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, heart INT DEFAULT 0 );이런 테이..

select for update에 대해서(feat deadlock, gaplock)

select for update가 뭘까?? 이름에서 알 수 있듯, 업데이트를 하기 위해 검색을 하는 것이다. 즉, 이후의 Update를 위해 select를 진행하는 것이라 할 수 있다. 그래서 뭐요? 사실 그냥 보면 뭐 그런갑다.. 할 수 있다. 근데 사실 저 select for update에서 중요한 것은, Select된 행의 UPDATE가 실제로 커밋되기 전까지 다른 트랜잭션이 이 행을 수정할 수 없다는 것이다. 뭔소리에요?? 그러니까 여러 트랜잭션이 하나의 레코드에 접근한다고 가정할 때, 현재 select for update 수행중인 내용은 변경 불가하다는 것이다!! 아래에서 실제로 보여주겠다. 실습 Table 먼저 human 테이블에 다음과 같은 데이터가 있다. 3개의 트랜잭션을 수행해 볼 것이다..

MySql 인덱스 - 기본 개념

MySQL 인덱스 실무에서 엄청나게 중요한녀석임... 이를 사용해서 select를 할 때에 데이터를 빠르게 응답하도록 할 수 있음! 사실 인덱스를 한다고 뭐 쿼리가 바뀌는건 아니다. 그냥 이걸 통해 속도를 빠르게 하는거임. 데이터베이스를 빠르게 하도록 하는 "튜닝" 에서 가장 핵심적인 것이 인덱스이다. 물론 막 쓰면 오히려 성능을 떨어뜨릴 수도 있다. 그래서 일단 인덱스의 개념이랑 활용 등을 찾아보도록 한다. 인덱스 개념 예를 들어 데이터베이스에 사람 이름 키 몸무게 을 갖는 테이블이 있을 때 1 류찬 178 70 2 김찬 189 99 3 박찬 140 39 4 이찬 180 34 5 반찬 200 50 6 징기스찬 160 50 7 가슴이벅찬 390 34 요런 식으로 있다고 하자. (일단 동명이인은 없다고 가..

Mysql 엔진 Lock

MySql 엔진 lock Mysql 엔진 레벨의 잠금은 모든 스토리지 엔진에 영향을 미친다. 글로벌 락(Global lock) FLUSH TABLES WITH READ LOCK 위의 명령을 통해 획들 가능한 잠금이다. 글로벌 락의 특징 MySql에서 제공하는 잠금 중 가장 범위가 큰 잠금이다. 해당 락이 활성화되면 전체 테이블/DB가 영향을 받는다. select를 제외한 DDL, DML문장은 글로벌 락이 해제되기 전까지 대기하게 된다. 해당 락은 MySql의 모든 테이블에 잠금을 걸게 된다. 추가적으로, 모든 테이블/DB에 대해 잠금을 걸기 때문에 해당 락 명령 실행 이전에 수행되던 트랜잭션/SQL이 끝날 때까지 대기하게 된다. 참고로 모든 SQL에 대해서이기 때문에 락 대상이 아닌 select 명령도 ..

MySQL8 대소문자 구분하기

MySQL8 대소문자 구분하기 MySQL은 기본적으로 대소문자를 구분한다. 그러면 이거를 대소문자를 구별하지 않도록 하려하면 어떻게 해야 할까?? 대소문자 구별 여부 확인하기 show variables like 'lower_case_table_names'; 다음 명령어를 입력하면 대소문자 구별여부를 알 수 있다. 0 대소문자 구별 O (default) 1 대소문자 구별 X 모든 네이밍을 소문자로 변환하여 저장 2 대소문자 구별 X 모든 네이밍을 사용한 그대로 저장 하지만 조회할 때에는 소문자로 변환하여 사용 대소문자 구별 여부 변경하기 저 lower_case_table_names를 바꾸면 알아서 바뀔 것이다. 그러면 그냥 set lower_case_table_name=1; 이렇게 하면 구별..