Driving 테이블조인시 먼저 액세스되는 쪽을 드라이빙 테이블(DRIVING TABLE, OUTER TABLE)이라고 하며 나중에 액세스 되는 테이블을 드리븐 테이블(DRIVEN TABLE, INNER TABLE)이라고 합니다. 인덱스(INDEX)의 존재 및 우선순위 혹은 FROM 절에서의 TABLE 지정 순서에 영향을 받으며 어느 테이블이 먼저 액세스되느냐에 따라 속도의 차이가 크게 날 수 있으므로 대량의 데이터를 다룰 때 정말 중요합니다. 조건을 만족하는 테이블과 해당하는 로우 데이터 수가 다음과 같다고 가정합니다. A 테이블: 1억건B 테이블: 100건 이 때, 조인시 드라이빙 순서에 따라 속도의 확연한 차이가 발생할 수 있습니다. A 테이블을 드라이빙하게 되면 최대 1억 번을 반복하며 B 테이블..
트랜잭션은 ACID라는 원자성(Atomicity), 일관성(Consistency), 격리성(Isolation), 지속성(Durability) 를 보장해야 합니다. 원자성: 트랜잭션 내에서 실행한 작업들은 마치 하나의 작업인 것처럼 모두 성공하든가 모두 실패해야 합니다.일관성: 모든 트랜잭션은 일관성 있는 데이터베이스 상태를 유지해야 합니다.격리성: 동시에 실행되는 트랜잭션들이 서로에게 영향을 미치지 않도록 격리합니다.지속성: 트랜잭션을 성공적으로 끝내면 그 결과가 항상 기록되어야 합니다. 이번 포스팅에서는 격리성에 대해서 알아보겠습니다. 트랜잭션 간에 격리성을 완벽히 보장하려면 트랜잭션을 거의 차례대로 실행해야 하며, 이 경우 동시성 처리 성능이 매우 나빠집니다.격리 수준은 4단계가 있습니다. READ_..
원인SQL 쿼리에서 동일한 이름의 컬럼이 여러 테이블에 존재할 때 발생합니다.이 경우 MySQL이 어느 테이블의 컬럼을 사용할지 명확하지 않기 때문에 이 에러를 발생시킵니다.SELECT id, nameFROM users u INNER JOIN orders o ON u.id = o.user_id 해결 방법테이블 명시하기 (또는 별칭 사용하기)동일한 이름의 컬럼이 있을 경우, 어느 테이블의 컬럼을 사용할 것인지 명확하게 지정합니다.SELECT u.id, u.name, o.idFROM users u INNER JOIN orders o ON u.id = o.user_id
MySQL 프로시저를 자바 코드로 이관하려고 합니다. 사유는 다음과 같습니다. 프로시저 안에서 트랜잭션을 선언하게 될 경우 스프링 트랜잭션과 별개로 트랜잭션이 생성되어 원자성 위배 버전관리가 어려움 프로시저의 새 버전이 나오면 _new, _v(n)등으로 새 버전의 프로시저를 생성 디버깅이 어려움 아래와 같은 프로시저가 있다고 가정합니다. CREATE PROCEDURE `procedure_v1` ( IN p_status INT(2) , IN p_member_id BIGINT ) BEGIN DECLARE v_status VARCHAR(10) DEFAULT NULL; SELECT status INTO v_status FROM member WHERE id = p_member_id; IF v_status p_st..