2017-02-13 16 views
0

테이블 크기가 약 10GB 인 응용 프로그램 중 하나에서 mysql 데이터베이스를 사용하고 있습니다. 기준과 일치하는이 표에서 행을 삭제하고 싶습니다. 삭제 쿼리의 형식은 다음과 같습니다.거대한 mysql 테이블에서 기준과 일치하는 행을 삭제합니다.

Delete from table_name 
where (a,b,c) in ((1,2,3),(1,5,6)); 

필드 (a, b, c)에 복합 색인이 있습니다. 쿼리는 행을 삭제하는 데 몇 분이 걸리는 반면 작업은 밀리 초 또는 몇 초 내에 수행됩니다. 이것을 어떻게 할 수 있습니까? 필드의 개별 색인은 다중 열 색인보다 빠릅니까? 쿼리가 같은 경우 내 말은 다음과 같습니다

Delete from table_name 
where a = 1 and (b,c) in ((2,3),(5,6)); 

이 빠른 결과를 얻을 수? 도와주세요.

+1

를 구축 ..? – scaisEdge

+0

[mysql WHERE 절에서 5,000에서 100,000 사이의 값을 전달하는 올바른 방법] 가능한 복제본 (http://stackoverflow.com/questions/39659553/correct-way-to-pass-between-5-000-to-100- 000-values-in-mysql-where-clause) – e4c5

답변

0

(a, b, c)에 대해 고유 한 값 집합이있는 경우 해당 값으로 표를 분할 할 수 있습니다. List Columns Partitioning. 테이블이 분할 된 후 "삭제 중"이 파티션을 삭제하고 매우 빠릅니다.

MySQL 5.7에서는 LIST COLUMNS 파티셔닝을 지원합니다. 이것은 여러 컬럼을 파티션 키로 사용할 수 있고 정수 유형이 아닌 데이터 유형의 컬럼을 파티션 분할 컬럼으로 사용할 수있는 LIST 파티셔닝의 변형입니다. 문서에서

예를 들어 테이블 : 당신이 좋아 보일 것 예상대로 내가 파티션 키로 여러 열을 사용하여 문서의 예를 찾을 수 있지만 수

CREATE TABLE customers_1 (
    first_name VARCHAR(25), 
    last_name VARCHAR(25), 
    street_1 VARCHAR(30), 
    street_2 VARCHAR(30), 
    city VARCHAR(15), 
    renewal DATE 
) 
PARTITION BY LIST COLUMNS(city) (
    PARTITION pRegion_1 VALUES IN('Oskarshamn', 'Högsby', 'Mönsterås'), 
    PARTITION pRegion_2 VALUES IN('Vimmerby', 'Hultsfred', 'Västervik'), 
    PARTITION pRegion_3 VALUES IN('Nässjö', 'Eksjö', 'Vetlanda'), 
    PARTITION pRegion_4 VALUES IN('Uppvidinge', 'Alvesta', 'Växjo') 
); 

...

CREATE TABLE customers_2 (
    first_name VARCHAR(25), 
    last_name VARCHAR(25), 
    street_1 VARCHAR(30), 
    street_2 VARCHAR(30), 
    city VARCHAR(15), 
    renewal DATE 
) 
PARTITION BY LIST COLUMNS(first_name,last_name) (
    PARTITION me_partition VALUES IN(('Alden','W'),('Aldino','W')), 
    PARTITION you_partition VALUES IN(('Pooja','Gupta'),('PJ','Gupta')) 
); 

테이블을 파티션하려면 약간의 멋진 바지 동적 SQL을 사용할 수 있습니다.

SET SESSION group_concat_max_len = 1000000000; 
SET @i = 0; 
SELECT CONCAT('ALTER TABLE customers_2 
PARTITION BY LIST COLUMNS(first_name,last_name) (
    ',GROUP_CONCAT('PARTITION partition_',@i:[email protected]+1,' VALUES 
IN((''',d.first_name,''',''',d.last_name,'''))' SEPARATOR 
',\n\t'),' 
);') 
FROM (
    SELECT DISTINCT first_name, last_name 
    FROM customers_2 
) d; 

당신은 절 "의"의 튜플을 얻는 방법이 다음과 같은 ALTER 문

ALTER TABLE customers_2 
PARTITION BY LIST COLUMNS(first_name,last_name) (
    PARTITION partition_1 VALUES IN(('Alden','W')), 
    PARTITION partition_2 VALUES IN(('Jon','Smith')), 
    PARTITION partition_3 VALUES IN(('Other','Name')), 
    ... 
);