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