====== MySQL Index ====== WHERE절에서 조건으로 쓰이는 컬럼을 인덱스로 만드는 것이 좋고, AND 연산으로 검색되는 컬럼들은 모두 하나의 인덱스로 만드는 것이 좋다. ===== REFERENCES 구문 사용하지 말 것. ===== * [[https://stackoverflow.com/questions/14230892/difference-between-using-references-with-and-without-foreign-key|mysql - Difference between using REFERENCES with and without FOREIGN KEY? - Stack Overflow]] * https://dev.mysql.com/doc/refman/5.7/en/create-table.html > MySQL parses but **ignores “inline REFERENCES specifications”** (as defined in the SQL standard) where the references are defined as part of the column specification. MySQL accepts REFERENCES clauses only when specified as part of a separate FOREIGN KEY specification. ===== Index 생성 ===== ==== Table 생성시 ==== CREATE TABLE tablename (id CHAR(13) NOT NULL, passwd CHAR(8) NOT NULL, name CHAR(8) NOT NULL, email CHAR(64) NOT NULL, INDEX (id) ); id 컬럼에 대한 인덱스를 생성한다. 두 개 이상의 컬럼에 대해서도 인덱스를 생성할 수 있다. INDEX(id, passwd) id 컬럼과 passwd 컬럼을 AND 조건으로 검색할 때 인덱스가 작동한다. ==== Table 생성 후 추가 ==== ALTER TABLE tablename ADD INDEX index_name(col1, col2,...); index_name으로 인덱스 추가. ==== CREATE INDEX ==== * [[https://dev.mysql.com/doc/refman/5.7/en/create-index.html|CREATE INDEX]] CREATE INDEX IDX_PART_OF_NAME ON customer (first_name, last_name); ===== Index 정보 보기 ===== SHOW INDEX FROM tablename; ===== Index 삭제 ===== ALTER TABLE tablename DROP INDEX index_name; ===== Index Hint ===== [[http://dev.mysql.com/doc/refman/5.6/en/index-hints.html|MySql Index Hints]] ==== Use Index ==== 특정 인덱스를 타도록 가이드 한다. SELECT id FROM data USE INDEX(type) WHERE type=12345 AND level > 3 ORDER BY id ==== Ignore Index ==== 특정 인덱스는 무시하고 다른 인덱스들을 대상으로 최적화한다. SELECT id FROM data IGNORE INDEX(PRIMARY) WHERE type=12345 AND level > 3 ORDER BY id ===== Covering Index ===== * [[https://gywn.net/2012/04/mysql-covering-index/|MySQL에서 커버링 인덱스로 쿼리 성능을 높여보자!! | gywndi's database]] * Index 에 있는 값만으로 ''where'', ''order by'', ''select 각 필드''를 처리할 수 있는 상황. * Query 실행계획에서 **Extra: Using index**가 나오는 상황. * 실제 데이터를 찾아 읽는 것보다 훨씬 빠르다. * 또한, 테이블 전체 컬럼이 select 대상이더라도 먼저 커버링 인덱스로 PK값만가져오고, 그 결과로 나머지 컬럼을 가져오는게 훨씬 빠른 경우도 많다. select a.* from ( -- 서브쿼리에서 커버링 인덱스로만 데이터 조건과 select column을 지정하고, select userno from usertest where chgdate like '2012%' limit 100000, 100 ) b join usertest a on b.userno = a.userno -- 조인을 통해 나머지 모든 컬럼(a.*) 조회 ===== 참조 ===== * [[http://code.openark.org/blog/mysql/7-ways-to-convince-mysql-to-use-the-right-index|7 ways to convince MySQL to use the right index]]