2015-02-18 2 views
4

Я попытался сравнить два столбца zipcode между двумя таблицами, чтобы увидеть, отсутствуют ли значения во втором.PHP array_diff VS mysql NOT IN

я первый хотел сделать это с MySQL, мой запрос был что-то вроде

'SELECT code FROM t1 WHERE t1 NOT IN (select code FROM t2)' 

Но это было очень медленно, так что я попробовал другой путь: Я сделал два выбора, а затем сравнили результаты с array_diff().

С MySQL: несколько минут, а иногда врезаться

С PHP: менее чем за 1 секунду.

Может кто-нибудь объяснить эти различия? Является ли мой SQL-запрос неправильным?

+5

Проверка того, какие значения отсутствуют в таблице (по сравнению с другой), может быть легко выполнена с помощью 'LEFT' или' RIGHT' 'JOIN', которые они только что сделали для таких действий .. альтернативно взгляните на это: http ://переполнение стека.com/questions/1733197/how-to-find-missing-value-between-two-mysql-tables – serjoscha

+0

Насколько велика ваша вторая таблица 't2' и у вас есть индекс в столбце' code', попробуйте добавить это и посмотреть, что произойдет. Мое предположение, почему это так медленно в mysql, состоит в том, что у вас нет определенного набора индексов. Попробуйте запустить запрос EXPLAIN из вашего терминала и посмотреть, какие ключи используются, т.е. 'EXPLAIN SELECT code FROM t1 WHERE ta NOT IN (SELECT code FROM t2);' – Cyclonecode

+0

Обе таблицы имеют около 50 000 строк. @serjoscha: Это хорошая идея. Пример, который я использовал, был найден в нескольких SO-потоках, поэтому он казался хорошим – FLX

ответ

3

Если ваша главная таблица имеет 50k строк, используя суб выбора в запросе приведет к 1 + 50k исполнениях из выбирает. Один для первой таблицы и 50 тыс. Выбирает, по одному для каждой строки. Сервер сравнивает строку с вашим подбором, который перезагружается каждый раз, когда итерирует основную таблицу. Вот почему ваш код sql занимает свое время, и это также может быть большой проблемой памяти.

serjoschas информация о присоединяется, чтобы исправить это в sql, оно должно быть еще быстрее, чем ваше php-решение.

Проверка, значения которых отсутствуют в таблице (по сравнению с другим) можно легко сделать с помощью влево или вправо РЕГИСТРИРУЙТЕСЬ они просто сделаны для таких действий, как это .. альтернативы посмотрите на это: How to Find Missing Value Between Two Mysql Tables - serjoscha

Одно решение:

SELECT code FROM t1 
WHERE code NOT IN (SELECT code FROM t2) 

будет:

SELECT t1.code 
FROM t1 
LEFT JOIN t2 
ON t1.code = t2.code 
WHERE t2.code is null 

Попробуйте. Кроме того, есть взгляд на индексации в Cyclone предлагает:

Если у вас нет индекса, вы должны определенно добавить один, так как это ускорит ваш запрос. Вы можете добавить такой индекс: ALTER TABLE ADD INDEX code_idx (код) это должно быть сделано для обеих таблиц. Если вы затем должны были выполнить EXPLAIN для запроса, вы увидите что-то вроде «Использовать где»; Использование индекса; Использование присоединиться буфер, который хорошо - Циклон

Индексация ускоряет запрос. Если таблица содержит только один столбец, поиск таблицы индексов с тем же содержимым, что и исходная таблица, будет таким же и избыточным. В противном случае я сильно рекомендую индексировать столбец кода t2, что приводит к значительному увеличению производительности и меньшему потреблению памяти.

+1

Ему также нужно будет использовать имя таблицы в сочетании с выбранным полем, т.е. 'SELECT t1.code', поскольку в этом случае« код »является неоднозначным. – Cyclonecode

+0

Спасибо, я исправил это и часть индексации. – Daniel

+1

Спасибо, хорошая сводка. Спасибо также Cyclone и serjoscha – FLX

Смежные вопросы