почему запрос внутреннего соединения mysql занимает так много времени - PullRequest
1 голос
/ 15 декабря 2009

в MySQL у меня есть две таблицы

TABLEA

col1   col2  SIM1 ..........col24
-----------------------------------
a       x     1             5 
b       y     1             3
c       z     0             2
d       g     2             1

TableB

colA   colB   SIM2
-------------------
x       g     1
y       f     0
x       s     0
y       e     2

На самом деле количество записей в двух таблицах составляет 0,4 миллиона

У меня есть Java-программа, из которой я выполняю SQL-запрос с использованием JDBC.

вот запрос

     SELECT * 
      FROM TableA 
INNER JOIN TableB ON TableA.SIM1 =  TableB.SIM2 
INTO OUTFILE 'c:/test12226.csv' "+ 
FIELDS TERMINATED BY ',' 
ENCLOSED BY '\"'  
LINES TERMINATED BY '\n' 

Этот запрос занимает очень много времени. чтобы мое заявление было осуществимо, это не должно занять более 30 секунд. Я понимаю, что записи 0,4 миллиона, но такая операция в мс доступа занимает менее 10 секунд. является ли комбинация java-mysql более трудоемкой, чем ms-access

Я выделил 1 ГБ оперативной памяти в конфигурации отладки. пожалуйста, предложите.

Ответы [ 3 ]

3 голосов
/ 15 декабря 2009

Я предполагаю, что один или оба из TableA.SIM1 и TableB.SIM2 не проиндексированы. Либо это, либо это разные типы данных (например, VARCHAR и NUMERIC). Попробуйте:

CREATE INDEX index_name1 ON TableA (SIM1);
CREATE INDEX index_name2 ON TableB (SIM2);

Без индексов этот запрос будет очень медленным. Одна таблица будет доступна запись за записью, что нормально, так как вы выводите всю таблицу целиком. Чтобы найти соответствующую запись в другой таблице, ее нужно найти на основе отношения SIM1 = SIM2.

Чтобы найти записи в другой таблице без индекса, необходимо просмотреть каждую запись. Это линейный или O (n) поиск. Поместите полмиллиона записей в каждую таблицу, и это огромное количество сравнений, необходимых для поиска всех совпадений (миллиарды в фактах).

С индексами совпадение записей почти мгновенно.

Думайте об этом так: индексирование столбцов похоже на размещение телефонной книги в алфавитном порядке. Это облегчает поиск фамилий. Если телефонная книга вообще не была отсортирована, сколько времени вам понадобится, чтобы найти чей-то номер телефона?

Теперь умножьте это на полмиллиона.

0 голосов
/ 15 декабря 2009

Когда вы выполняете внутреннее соединение между двумя таблицами, содержащими 10000 строк в каждой. Он должен пройти 10000 * 10000 строк (если столбцы не проиндексированы). Если вы хотите, чтобы они были быстрыми, вы должны индексировать TableA.SIM1 и TableB.SIM2. Это сократит время выполнения запроса.

Для индексации используйте следующие команды

create index on TableA (SIM1);
create index on TableB (SIM2);
0 голосов
/ 15 декабря 2009

У вас есть настроенные индексы для TableA.SIM1 и TableB.SIM2?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...