6,966.28
전일대비 44.82 (+ 0.65% )
23,671.35
전일대비 191.33 (+ 0.81% )
49,504.07
전일대비 237.96 (+ 0.48% )
mysql 클라이언트를 이용하여 mysql 서버 접근시 safe-updates 라는 옵션이 있습니다. 아래와 같이 뒤에 "--safe-updates" 를 붙여주면 되는데요.
root@shkim-VirtualBox:~# mysql -u root -p --safe-updates
해당 명령어의 역할은
UPDATE, DELETE 그리고 SELECT 쿼리가 인덱스를 사용하지 못할 때 다음과 같이 에러를 발생시키고 쿼리를 중지시켜줍니다.
# flag 필드는 인덱스가 걸린 필드가 아니기 때문에 조건으로 사용불가
MariaDB [npay]> DELETE FROM t_test WHERE flag='T';
ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column
# no 는 primary key 라 조건 사용가능
MariaDB [npay]> DELETE FROM t_test WHERE no=2;
Query OK, 1 row affected (0.001 sec)
이게 왜 필요하냐면, 만일 인덱스를 사용하지 않고 쿼리를 실행한다면 모든 레코드를 업데이트하거나 지워버리는 불상사가 생길 수 있기 때문이죠.
회사에서도 운영 DB 에 접근할 일이 있는데, 앞으로는 해당 옵션을 꼭 붙여야겠네요.
단계 1) 사용자로부터 요청된 SQL 문장을 잘게 쪼개서 MariaDB 서버가 이해할 수 있는 수준으로 분리 (파스 트리) 한다. - SQL 파싱 (Parsing)
단계 2) SQL 의 파싱 정보 (파싱트리) 를 확인하면서, 어떤 테이블부터 읽고 어떤 인덱스를 읽을지 선택한다. - 옵티마이져
불필요한 조건의 제거 및 복잡한 연산의 단순화
여러 테이블의 조인이 있는 경우 어떤 순서로 테이블을 읽을지 결정
각 테이블에 사용된 조건과 인덱스의 통계 정보를 이용해 사용할 인덱스를 결정
가져온 레코드들을 임시 테이블에 넣고 다시 한번 가공해야 하는지 결정
단계 3) 두번째 단계에서 결정된 테이블의 읽기 순서나 선택된 인덱스를 이용해 스토리지 엔진으로부터 데이터를 가져온다.
수립된 실행 계획대로 스토리지 엔진에 레코드를 읽어오도록 요청하고 MariaDB 엔진에서는 스토리지 엔진으로부터 받은 레코드를 조인하거나 정렬하는 작업진행.
회사 업무 중, 업데이트 일자에 대한 컬럼을 추가해야 하는 경우가 생겼다.
초기에는 컬럼추가하는 것은 자원낭비 및 추가개발이 필요하여 등록일자 (ins_timestamp) 컬럼을 업데이트 하는 것이 어떨까 생각했다.
하지만 등록일자를 업데이트 하는 것은 다른 의미의 컬럼을 이용하는 것이기 때문에 올바르지 않은 컬럼 사용이라 판단이 들어 진행하지 않았다.
생각보다 문제는 간단하게 해소되었다.
위와 같이 진행하면 UPDATE 쿼리가 실행되는 시점에 해당 컬럼 upd_timstamp 에 현 시점의 timestamp 로 자동 update 가 된다.
다들 참고 하기를..