2017-02-13 3 views
0

Я использую базу данных mysql в одном из моих приложений, размер таблицы которого составляет около 10 ГБ. Я хочу удалить строки из этой таблицы, соответствующие критериям. Удалить запрос имеет следующий вид:, чтобы удалить критерии соответствия строк из огромной таблицы 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

Возможный дубликат [Правильный способ передачи от 5000 до 100 000 значений в mysql WHERE] (http://stackoverflow.com/questions/39659553/correct-way-to-pass-between-5-000-to-100- 000-значения-в-MySQL-где-п) – 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 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')), 
    ... 
); 
Смежные вопросы