Q&A

Q&A : MySql 관련 질문 모음

개인적으로 모르는 부분 적어두고 알게 되는 부분에 대해서 간단하게 정리해둔 자료입니다. 미 답변중에 알고 계신 부분 있으면 코멘트 달아주세요. 감사합니다.

Q&A 전체 목록

[답변완료]

1. 테이블 생성시 InnoDB를 왜 설정해야 하나?

image 11

MySQL의 Storage Engine에는 여러 가지가 존재합니다. 제일 많이 사용되는 버전은 MyISAM와 InnoDB입니다. 테이블 생성시 어떤 엔진을 사용할 지 설정할 수 있습니다.

image 4

참고

2. 왜 auto_increment를 하면 1로 증가하지 않고 4씩 증가하나?

기본 설정은 1씩 증가하지만 autoincrementincrement 값을 다르게 설정하면 지정한 값만큼 증가하게 됩니다.

mysql> show variables like 'auto_inc%;

image 6

참고

3. Sql 문구에서 가끔씩 ‘@변수 := …’ 를 발견했다. 무슨 의미일까?

image 7

사용자 정의 변수를 저장할 때 사용합니다. 이 경우에는 SELECT로 구한 media_no 값을 mediaNo 변수에 저장합니다.

참고

4. COUNT(*) vs COUNT(1) vs COUNT(pk)의 차이점?

  • COUNT(*)

    • 행의 개수를 카운트한다
    • NULL도 포함해서 카운트한다
  • COUNT(1)

    • 행의 개수를 카운트하지만, 하나의 테이블에 대해서만 쿼리가 되고 JOIN한 Table 쿼리를 안된다
    • 사용하지 말라는 의견이 있다
  • COUNT(pk)

    • NULL아 아닌것만 카운트한다

참고

5. IFNULL() 함수?

IFNULL(expression, altvalue) 형식으로 expressoin이 NULL이면 altvalue를 반환합니다.

image 2

참고

6. ‘order by 2,1’는 어떻게 정렬을 하라는 건가?

두번째 컬럼으로 정렬하고 중복 값이 있는 경우에는 첫번째 컬럼으로 정렬하라는 의미입니다.

참고

6. MySQL Error 1093 : You can’t specify target table ..for update in FROM clause가 발생하는 경우, 어떻게 처리하면 되나?

아래 SQL 실행시 오류가 발생하였습니다.

UPDATE ` tmon_media ` . ` media_external_trans `
SET use_yn = 'Y'
WHERE trans_seqno IN (SELECT trans_seqno FROM media_external_trans as t where t.trans_seqno > 3162);

원인은 MySQL은 Oracle과 달리게 UPDATE나 DELETE 할때 자기 테이블의 데이터를 바로 사용하지 못하는 이슈가 있어서 서브 쿼리를 하나 더 생성하여 임시 테이블을 만들어서 해결하면 됩니다.

해결

image 9

참고

8. MySql에서 모든 query에 대해서 로깅을 하려면 어떻게 해야 하나?

MySql 설정에서 general_log을 활성화시켜면 됩니다.

mysql> set global general_log=ON;
mysql> show variables like ‘general%;

참고

8. MySql에서 general_log가 활성화되어 있지 않는 경우 query를 확인하는 방법은 없나?

MySql 실행시 모든 명령문을 bin log로 저장한다면 확인할 수 있습니다. bin log 로그 분석에 대한 자세한 사항은 아래 링크를 참조해주세요.

참고

9. Slow Query란?

Slow Query란 말 그래도 query 수행시 오래 걸리는 쿼리를 의미합니다.

참고

10. 페이징에서 offset과 limit은 어떻게 사용되나?

많은 데이터를 한번에 가져올 수 없기 때문에 페이징으로 부분적으로 데이터를 가져올 때 LIMIT과 OFFSET을 사용합니다.

  • LIMIT : 가져올 데이터의 개수
  • OFFSET : 검색된 데이터중에서 몇번째부터 가져올 것인지 정하는 시작번호

참고

11. Server time zone value ‘KST’ is unrecognized… 오류 메시지가 나는 경우 해결책은?

여러 사항에 따라서 해결 방법이 다를 것으로 판단됩니다. 저희 경우에는 pom.xml에서 mysql-connector-java의 버전(ex. 8.0.13 —> 5.1.47)을 변경해서 해결했습니다.

image 10

참고

12. JOIN시 ON과 WHERE의 차이점은?

내부 조인일 경우 ON 절은 WHERE 절을 사용 할 때와 결과가 같아서 외부 조인일 때만 ON을 사용하면 됩니다.

참고

13. 변수에 지정한 값 출력을 어떻게 하나?

image 3

SELECT @lastMediaNo로 실행하면 됩니다.

참고


[미 답변 질문]

- 하나의 행의 값을 복사하되 몇 열 값만 변경하고 싶을 때?

참고

- 데이터 migration은 어떻게 하나? 예. 한 테이블에 있는 데이터를 분리하는 작업은 어떻게 진행하면 되나?

INSERT INTO ` tmon_media ` . ` media_live_job ` ( ` live_seqno ` , ` job_id ` , ` strm_stts ` , ` rtmp_url ` , ` rtmp_key ` , ` playback_url ` , ` original_repo ` , ` original_file_nm ` ,
` video_rt ` , ` start_dt ` , ` finished_dt ` , ` use_yn ` , ` creator ` , ` create_dt ` , ` updater ` , ` update_dt ` )
SELECT ` live_seqno ` , ` live_job_id ` AS ` job_id ` , ` strm_stts ` , ` rtmp_stream_url ` , ` rtmp_stream_key ` , ` playback_url ` , ` original_repo ` , ` original_file_nm ` ,
` video_rt ` , NOW() AS ` start_dt ` , NOW()+INTERVAL 1 MINUTE AS ` finished_dt ` , 'Y' AS ` use_yn ` , 'tvon' AS ` creator ` ,
` create_tm ` AS ` create_dt ` , 'brightcov' AS ` updater ` , ` update_tm ` AS ` update_dt `
FROM ` tmon_media ` . ` media_info_live ` WHERE ` live_job_id ` IS NOT NULL;

- 테이블 복사는 어떻게 하나?

INSERT INTO tmon_media.media_info_live SELECT * FROM tmon_media.bak_media_info_live;

- group_concat이란?

image 5

image 1

image 8

참고