Как ускорить сравнение двух таблиц в MySQL - PullRequest
1 голос
/ 03 апреля 2012

У меня есть две большие таблицы в MySQL, одна из которых содержит около 60000 записей, а другая содержит около 90000. У меня есть одно общее поле в этих двух таблицах, на основании которого я хочу сравнить записи. Я проиндексировал обе таблицы в этом общем поле, но выполнение запроса все еще занимает очень много времени. Ниже приведен запрос, который я использовал:

SELECT a.url,a.title,a.description,a.jobreferenceno,a.location,a.state,
    a.country,a.created_datetime,a.postalcode,a.company
FROM TABLE1 as a
WHERE EXISTS (
    select b.checkfield
    from TABLE2 as b where a.checkfield=b.checkfield
);

checkfield - это общий столбец в обеих таблицах.

Любые предложения о том, как ускорить его?

Ответы [ 5 ]

1 голос
/ 03 апреля 2012

Проверьте, быстрее ли с объединением вместо подзапроса:

SELECT a.url, a.title, a.description, a.jobreferenceno, a.location, a.state, a.country, a.created_datetime, a.postalcode, a.company FROM TABLE1 as a join TABLE2 as b on a.checkfield=b.checkfield;
1 голос
/ 03 апреля 2012

Это должно быть быстрее:

SELECT a.url,a.title,a.description,a.jobreferenceno,a.location,a.state,a.country,a.created_datetime,a.postalcode,a.company
FROM TABLE1 a 
LEFT JOIN TABLE2 b USING (checkfield)
WHERE b.checkfield IS NOT NULL
0 голосов
/ 03 апреля 2012
Подзапросы

, как и использованный здесь подзапрос EXISTS, печально известны медленной работой в MySQL. Вы должны конвертировать их в JOIN, если у вас есть такая возможность. JOIN запрос для вашего примера будет выглядеть так:

SELECT a.url
,a.title
,a.description
,a.jobreferenceno
,a.location
,a.state
,a.country
,a.created_datetime
,a.postalcode
,a.company 
FROM TABLE1 as a 
INNER JOIN TABLE2 as b 
ON         a.checkfield = b.checkfield

(Обратите внимание, что это не совсем то же самое, что и ваш оригинал: здесь любая строка из TABLE1, которая соответствует нескольким строкам в TABLE2, будет возвращена несколько раз. Если контрольное поле уникально в обеих таблицах, результат будет одинаковым. )

Тем не менее, неясно, как это действительно помогает - вы на самом деле не сравниваете строки здесь, просто выбираете те строки из TABLE, для которых есть хотя бы одна строка в TABLE2, которая имеет одинаковое значение в контрольном поле

(во всяком случае, checkfield должен быть проиндексирован в обеих таблицах, чтобы повысить эффективность этих запросов)

0 голосов
/ 03 апреля 2012

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

SELECT a.url,a.title,a.description,a.jobreferenceno,a.location,a.state,a.country,a.created_datetime,a.postalcode,a.company 

FROM TABLE1 as a INNER JOIN TABLE2 as b ON a.name=b.name;

Дополнительная информация - http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html

0 голосов
/ 03 апреля 2012

Поскольку есть одно общее поле, вы можете использовать INNER JOIN

SELECT a.url, a.title, a.description, a.jobreferenceno, a.location, a.state, a.country, a.created_datetime, a.postalcode, a.company FROM table1 a 
INNER JOIN table2 b USING (checkfield)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...