2015-04-16 4 views
3

Я объединяю два набора данных, каждый из которых имеет ~ 1M строк с использованием Google SQL Cloud (MySQL 5.5 w/4GB RAM), и для выполнения требуется более 5 часов. Я запускаю следующий запрос от Sequel Pro:Как улучшить время запроса MySQL

create table newtable as (select * from table1 t1 left join table2 t2 using (key)) 

В каждой таблице имеется приблизительно 20 столбцов VARCHAR. Ключ также является VARCHAR.

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

EDIT: каждая таблица ~ 250MB

+1

только сколько данных составляют эти строки ~ 1M? вы должны включить время, чтобы физически скопировать все данные из исходной таблицы в новую. это не то, что вы можете оптимизировать, играя с синтаксисом sql. это предел системы хранения. –

+0

Вы можете создать индекс ВСЕХ столбцов в таблице. Таким образом, mysql не должен извлекать информацию из файла данных для таблицы. Конечно, индекс будет огромным и займет некоторое время, чтобы добавить к таблице. Но, возможно, все в порядке. Я не совсем понимаю ваш полный набор требований. – Vinbot

+0

Я предполагаю, что ключи varchar не являются кластеризованными ключами? Установлены ли они как ПЕРВИЧНЫЙ КЛЮЧ или другой тип ограничения? –

ответ

0

Глупо, как это может показаться вам может повезти экспортировать таблицу с туздЫшпр, изменив имя таблицы, а затем повторно импортировать его.

+0

Зачем это поможет? – Nick

+0

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

+0

Спасибо за объяснение :) – Nick

3

Первое, что я заметил, это то, что ваш KEY установлен как VARCHAR. Это может быть основной причиной низкой производительности, которую вы испытываете. Это можно улучшить, добавив автоматически увеличивающийся цельный PRIMARY KEY. Поскольку каждая строка из миллионов значений KEY в таблице 1 индивидуально сопоставляется с каждым из миллионов значений KEY в 'table2', это делает задачу с высокой степенью производительности, более того, путем сравнения между каждым из символов в каждом Струнов. Поскольку использование целых чисел является простым значением для сравнения, оно будет иметь гораздо меньшее влияние.

Размер уровня вашего Cloud SQl Instance также будет иметь большое влияние на производительность из-за ограничений физического оборудования на вашем экземпляре. Вы можете временно изменить уровень своего экземпляра, чтобы протестировать его в разделе «Изменить» вашего пользовательского интерфейса Cloud SQL или с помощью Cloud SDK.

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