2010-06-16 3 views
1

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

При этом я успешно использую следующий запрос с меньшими данными, но если я использую его на небольших таблицах (около 120 000 записей). Я жду часов.

INSERT INTO anothertable 
    (id,someint1,someint1,somevarchar1,somevarchar1) 
    SELECT DISTINCT md.id,md.someint1,md.someint1,md.somevarchar1,pd.somevarchar1 
    FROM table1 AS md 
    JOIN table2 AS pd 
    ON (md.id = pd.id); 

В таблицах 1 и 2 содержится около 120 000 записей. Запрос работает почти 2 часа. Это нормально? Я просто должен ждать. Я действительно не знаю, но я уверен, что можно сделать это лучше, так как это моя первая попытка.

Я читал об индексировании, но еще не знаю, что индексировать в моем случае?

Благодарим за любые предложения - не стесняйтесь указывать мои инструкции для начинающих!

ответ

1

Предполагая, что id является автоинкрементальным PK, DISTINCT бесполезен, поскольку каждая строка будет уникальной. В этом случае его удаление также должно повысить производительность, так как SELECT DISTINCT может быть довольно медленным.

И как уже упоминалось выше, убедитесь, что поле id имеет индекс на обеих таблицах (что делает, если это PK).

+0

Извините, что не упомянул об этом. Идентификатор не является идентификатором PK auto_increment, таблицы имеют некоторый auto_increment id PK, но он здесь не используется, потому что я не могу сопоставить данные, используя эти два. –

1

Укажите, к чему вы присоединяетесь. В этом случае создайте индексы на table1.id и table2.id. Вероятно, вы также должны иметь внешний ключ из одной таблицы в другую, хотя без значимых имен, трудно дать рекомендации по направлению.

0

Единственное, что можно было бы проиндексировать, может быть, получить некоторую скорость - это ключи от объединений (md.id и pd.id). Поскольку они, скорее всего, являются первичными ключами, они должны быть проиндексированы уже. Может быть, кластеризованный индекс принесет что-то.

Действительно ли DISTINCT необходимо? Он просто удаляет дубликаты, и это может быть возможно только при наличии дублирующих записей в ваших исходных таблицах. Я думаю, что DISTINCT - самая большая проблема здесь.

+0

thx. DISTINCT необходимо здесь, потому что то, что я делаю, является совокупными данными. Таблица 1 содержит наблюдения из разных точек времени, тогда как таблица 2 содержит некоторые метаданные наблюдения . «anothertable» - это таблица, которая объединяет информацию, поэтому каждый человек нужен только один раз, , поэтому я использую DISTINCT. –

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