2010-09-18 4 views
3

Я пытался выполнить объединение в двух таблицах в MySQL, и запрос будет работать в течение минуты или двух, прежде чем у меня закончится память, не получая результатов. Я далек от эксперта по базам данных, поэтому не уверен, что я плохо писал свои запросы, если у меня неправильно настроены настройки MySQL или я действительно должен делать что-то еще с моим запросом. FYI база данных находится локально на моей машине.Плохое MySQL Присоединиться к производительности

У меня есть большая таблица (~ 2 миллиона записей), где один из столбцов - это идентификатор в небольшой таблице (~ 3000 записей). В случае, если это имеет значение, идентификатор не уникален в большой таблице, но уникален в маленькой таблице. Я пробовал различные вкусы следующего запроса, но ничего не кажется, работает:

SELECT big_table.*, 
     small_table.col 
    FROM big_table 
left outer join small_table on (big_table.small_id = small_table.id) 

Я делаю много анализа на данных, требует все 2 миллиона строк, хотя и не обязательно в одном запрос. Вот результаты моих «создать таблицу шоу»:

'big_table', 'CREATE TABLE 'big_table' (
    'BIG_ID_1', varchar(12) NOT NULL, 
    'BIG_ID_2', int(100) NOT NULL, 
    'SMALL_ID' varchar(8) DEFAULT NULL, 
    'TYPICAL_OTHER_COLUMN' varchar(3) DEFAULT NULL, 
    ... 
    PRIMARY KEY ('BIG_ID_1', 'BIG_ID_2') 
) ENGINE=MyISAM DEFAULT CHARSET=latin1' 

'small_table', 'CREATE TABLE `small_table` (
    `id`, varchar(8) NOT NULL DEFAULT '''', 
    `col`, varchar(1) DEFAULT NULL, 
    ... 
    PRIMARY KEY (`id`), 
    KEY `inx_id` (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1' 

Вот это «объяснить» результат для одного из моих кандидатов запросов:

 
id select_type table  type possible_keys key  key_len ref       rows  extra 
1 SIMPLE  big_table ALL  NULL   NULL  NULL  NULL      1962193  
1 SIMPLE  small_table eq_ref PRIMARY,inx_id PRIMARY 10  db_name.big_table.SMALL_ID 1   
+0

И какие у вас индексы? Если вы скажете, что это, вероятно, проблема. – James

+0

Как вы выполняете запрос? В браузере запросов MySQL? С языка программирования? Если последний, на каком языке, и можете ли вы разместить соответствующую часть кода? Кроме того, зачем вам читать 2 миллиона строк? Что вы будете делать со всеми этими данными? –

+1

И опубликуйте вывод 'EXPLAIN SELECT ...' для вашего запроса и вывод 'SHOW CREATE TABLE big_table' и' SHOW CREATE TABLE small_table'. –

ответ

3

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

Вещи, которые вы могли бы хотеть попробовать:

  • Если вам не нужны все столбцы, то запрос для столбцов, которые необходимо вместо использования SELECT table.*.
  • Посмотрите, можете ли вы переместить некоторые (или все) обработки в базу данных, а не извлекать данные и обрабатывать их в клиенте.
  • Избегайте чтения всего набора результатов в память за один раз.
  • Обработайте ряды в несколько тысяч штук одновременно, а не извлекайте их все сразу.
+0

Да, конечно, ограничение набора результатов с помощью «WHERE» или «LIMIT» ускорит его, но тогда запрос не делает то, что я хочу. Я действительно хочу обработать все 2 миллиона записей, так как это мне поможет? Или вы предлагаете включить этот запрос во многие небольшие запросы с «LIMIT 0, 10000», «LIMIT 100001, 200000» и т. Д.? В моей наивности я бы предположил, что последнее не должно быть необходимым или полезным ... –

+1

@Michal McGowan: Какая обработка? Вы считали, возможно ли обрабатывать данные в базе данных, а не переносить их на клиент для обработки? Я также думаю, что было бы неплохо опубликовать код Java, который вы используете, для выполнения запроса и чтения результатов. У вас может быть проблема. Если возможно, вы хотите обрабатывать одну строку за раз, а не читать весь набор результатов за один раз. Разделение его на партии также может быть хорошей идеей, но использование LIMIT со смещением не является оптимальным способом сделать это, так как это будет замедляться и замедляться по мере увеличения смещения. –

+0

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

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