1. 구매내역.상품시퀀스 컬럼 하나가 2개의 상품 테이블의 시퀀스를 모두 참조하도록 하셨는데, 이 부분은 잘못된 설계인 것 같습니다.
여행상품관리.시퀀스와 쿠폰상품관리.시퀀스를 각각 참조하는 2개의 컬럼을 NULL을 허용하도록 추가하고 `구분` 컬럼에 따라 어느 테이블을 참조하는지 구분하는 것이 좋을 것 같네요.
첨부한 ERD 대로라면.. 여행상품과 쿠폰상품 테이블 모두에 들어있는 시퀀스 값만 구매내역 테이블에 INSERT 할 수 있는데... 이 모델에서는 그렇게 동작하면 안되니까요.
2. 인덱스를 타고 안타고는 첫째로 인덱스가 있는가? 둘째로 인덱스를 타도록 쿼리를 작성했는가? 로 나누어 생각해 볼 수 있습니다.
- MySQL에서는 foreign key를 생성하면 자동으로 참조 컬럼에 인덱스를 생성합니다. (미리 인덱스를 만들어 놓고 참조키를 생성하는 방식을 추천하고 싶기는 하지만...)
- 위 모델 기준으로는 구매내역.상품시퀀스에 인덱스가 있는 상태이니.. 구매내역 테이블을 쿼리할 때 WHERE 절에 상품시퀀스를 사용한다면.. 인덱스를 타는 기본 요건은 됩니다. (옵티마이저 판단하에 풀스캔이나 다른 인덱스를 타는게 낫다면 논외...)