MYSQL
partition / index 타기 (정리 예정)
kcj3054
2022. 9. 18. 21:53
index 타기
- 정리 예정..
explain select * from RedDB.`Character` c WHERE CharacterId = 1
show INDEX from RedDB.`Character`
explain select * from `Character` c WHERE CharacterId = 1 order by Nickname
optimize table `Character`
show table status -- Data_length가 clustered index, index_length는 nonclustered_index
- where, order by, group by 등에는 가능한 index가 걸린 컬럼 사용.
- where절에 함수, 연산, like(시작 부분 %) 문은 인덱스를 안탄다.
- between ㅡ, ㅣlike 대소비교는 범위가 크면 인덱스를 타지않는다
- offset이 길어지면 인덱스를 타지 않는다
- 범위절 보다는 in 절을 사용하는 것이 좋고 in 보다는 existx가 더 좋다 // 왜?
PARTITION
- 하나의 테이블에 너무 많은 테이블이 존재한다면 테이블을 쪼개서 관리할 수 있는데 그것이 파티션이다. 파티션을 한다면 FK는 지정이 불가능하고, PK를 지정할 경우 PK가 partition key(나눌 수 있는 기준)가 된다
예시
create DATABASE TestDb;
use TestDb;
DROP table IF EXISTS TestDb.PartionRangeTest;
create table IF NOT EXISTS PartionRangeTest (
uniqueno varchar(7) not null,
money bigint not null,
name varchar(31) not null)
PARTITION BY RANGE (money) (
PARTITION p1 VALUES LESS THAN (1000000),
PARTITION p2 VALUES less than (3000000),
PARTITION p3 VALUES less than MAXVALUE
);
INSERT INTO PartionRangeTest(uniqueno, money, name)
values ('1', 5000, '중국인1'),
('2', 50000000, '미국인1'),
('3', 2000000, '가리봉동인');
- 위에서 기준을 money 컬럼으로 파티션을 나눴습니다.
select * from information_schema.PARTITIONS p
WHERE TABLE_NAME = 'PartionRangeTest'
EXPLAIN select * from PartionRangeTest
WHERE money = 3000000