Это оптимальный запрос для того, что я пытаюсь сделать в MySQL? - PullRequest
1 голос
/ 22 июля 2010

Я выполняю несколько запросов, которые объединяют постоянно меняющиеся данные в основную таблицу, и один из запросов (ниже), кажется, выполняется довольно медленно.

Настройка выглядит следующим образом: products таблица и products_temp таблица имеют идентичные структуры. Новые данные поступают в таблицу products_temp, затем я выполняю запросы, аналогичные приведенным ниже, чтобы объединить новые данные с основной таблицей products.

INSERT INTO products ( name, brand, price, feeds_id, img_url, referral_url, productid, isbn, ean, upc )
SELECT name, brand, price, feeds_id, img_url, referral_url, productid, isbn, ean, upc
FROM products_temp 
WHERE feeds_id = 449
AND productid NOT IN (
    SELECT productid
    FROM products
    WHERE feeds_id = 449
)

Обе эти таблицы имеют индексы на feeds_id, но я чувствую, что это не имеет никакого значения.

Например, products может содержать более 3,5 миллионов строк, а products_temp может содержать 50000 для объединения products.

Итак, мой вопрос на самом деле: сколько времени это займет? Как быстро я могу это сделать?

Ответы [ 4 ]

0 голосов
/ 16 мая 2012

Попробуйте выполнить рефакторинг запроса и настройте его как ЛЕВОЕ СОЕДИНЕНИЕ, проверяющее NULL на правой стороне

INSERT INTO products ( name, brand, price, feeds_id,
img_url, referral_url, productid, isbn, ean, upc )
SELECT A.name, A.brand, A.price,
A.feeds_id, A.img_url, A.referral_url,
A.productid, A.isbn, A.ean, A.upc
FROM
(SELECT * FROM products_temp A WHERE feeds_id = 449) A
LEFT JOIN
(SELECT productid FROM products WHERE feeds_id = 449) B
USING (productid)
WHERE B.productid IS NULL;

, также убедитесь, что у вас есть этот индекс

ALTER TABLE products_temp ADD INDEX feeds_id (feeds_id);
0 голосов
/ 22 июля 2010

вам следует избегать ГДЕ х нет (выберите ххх). Оптимизатор запросов mysql содержит много подзапросов и игнорирует, например, индексы.

0 голосов
/ 16 мая 2012

Вы можете сбросить индекс на feeds_id и добавить уникальный ключ (feeds_id, productid) в основной таблице.Таким образом, вы сможете использовать INSERT IGNORE для слияния.Обратите внимание на порядок полей в индексе - feeds_id должно быть первым, поэтому вы можете выполнить поиск по feeds_id, используя этот индекс.

NOT IN может вызвать замедление.В зависимости от того, что находится внутри скобок, запрос может зависнуть в состоянии «подготовка».

Если вы все еще испытываете замедления, используйте EXPLAIN или функцию профилирования.

0 голосов
/ 22 июля 2010

То есть эта техника называется Трюк с таблицей теней .

...