Индексирование для быстрого СОЕДИНЕНИЯ между регулярно усеченной таблицей и большой таблицей в MySQL - PullRequest
0 голосов
/ 12 октября 2011

У меня есть две таблицы, которые регулярно объединяются.

Таблица 1 составляет около 1 млн. Строк и растет ежедневно. Таблица два всегда примерно на 200 тысяч меньше, чем Таблица первая. Кроме того, таблица два усекается и заполняется каждую ночь из отчета, загруженного из сторонней службы. Используемый мной запрос UPDATE..JOIN не слишком быстрый, поэтому я ищу возможное решение.

Таблица 1:

#I grow daily and currently am around 1 million rows.
CREATE TABLE table_one(
 id INT NOT NULL AUTO_INCREMENT,
 sku VARCHAR(30), 
 other_one VARCHAR(30),
 PRIMARY KEY(id)
);

Структура таблицы два:

#I get truncated every night and am about 200k less rows than Table One.
CREATE TABLE table_two(
 id INT NOT NULL AUTO_INCREMENT,
 sku VARCHAR(30), 
 other_two INT,
 PRIMARY KEY(id)
);

Обратите внимание, что поля other_one и other_two в обеих таблицах служат для демонстрации того, что в каждой таблице есть поля (в основном varchar), кроме id и sku, но на самом деле в каждой таблице много разных столбцов. Я не уверен, что это имеет значение, но SKU уникален на втором столе, но уникален только в 95% случаев на первом столе. Из-за этого уникальность не обеспечивается ни для одной таблицы в MySQL.

Итак, вот мой рабочий процесс и вопрос:

1) В течение дня в Таблицу 1 добавляется куча новых строк.
2) Каждую ночь Таблица 2 усекается (все строки удалены)
3) Отчет загружается от третьего лица в виде файла CSV. Затем этот отчет загружается в таблицу два с помощью команды LOAD DATA LOCAL INFILE.
4) выполняется 3 запроса, которые обновляют данные Таблицы 1 и включают в себя JOIN. Все они очень похожи на это:

UPDATE table_one t1
JOIN table_two t2 ON t2.sku = t1.sku
SET t1.other_one = "Other two was greater than zero!"
WHERE t1.other_one IS NULL AND t2.other_two > 0

Учитывая количество строк, которые у меня есть, выполнение JOIN-соединений между этими двумя таблицами занимает довольно много времени. Мне было любопытно, что с тремя сложными запросами на обновление было бы лучше создать индекс для этих таблиц. Проблема в том, что эти индексы, скорее всего, придется воссоздавать каждую ночь, когда заполняется вторая таблица. Я не знаю, как это может повлиять на скорость населения, и не знаю, какой тип индекса мне следует использовать.

1 Ответ

0 голосов
/ 12 октября 2011

Вы, конечно, хотите иметь индексы для таблиц. Во второй таблице удалите индекс перед усечением таблицы и перезагрузкой данных. После перезагрузки данных заново создайте индекс.

...