2015-02-18 3 views
0

У меня есть запрос mySQL с объединением в 11 таблицах с примерно 50000 строк в каждой таблице, все из которых связаны серийным номером, общим во всех таблицах.
Хотя мне нужна только одна строка для каждого серийного номера, но MYSQL принимает возрастов, чтобы выполнить запрос, как он должен присоединиться к так много таблиц с таким количеством строк
я считаю, что нужно создать вокруг 50000^11 (11 у власти)Лучшее решение, чем объединение

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

select distinct serial, one.data1,two.data2,three.data3 from list 
left join (select * from table1) as one on list.serial=one.serial 
left join (select * from table2) as two on list.serial=two.serial 
left join (select * from table3) as three on list.serial=three.serial 

объединяются лучше или подзапросы?
Есть ли лучший способ построить sql-запрос, который занимает меньше времени?
если да, как?

+0

Существуют ли индексы в столбце «serial» для всех таблиц? – stwalkerster

ответ

0

Одним из решений является создание и поддержка отдельной таблицы индексов, которая состоит из нужных вам данных (последовательный, один. Data1, two.data2, three.data3, например). Переиндексирование (запрос и вставка записей) в этой таблице приведет к накладным расходам, но все последующие запросы могут сэкономить много накладных расходов.

Другим решением, которое я нашел полезным, является выполнение программных объединений. Когда объединение нескольких таблиц с простыми критериями требует слишком большого объема памяти, может произойти значительное снижение производительности. Вы должны попробовать сравнить бенчмаркинг с наборами данных, построенными из простых запросов, используя любой родной язык программирования, на котором вы работаете (например, PHP). Иногда вы можете получить ребро, используя этот метод.

+0

вы можете поделиться ссылкой на решение? я боюсь, что я не знаком с datapoints и multitables и т. д. –

+0

В принципе идея состоит в том, что вы создаете новую таблицу с теми же столбцами, что и запрос. Затем вы делаете «INSERT INTO my_index_table (col1, col2, ..., coln) SELECT .. (добавьте большой запрос здесь) ...». Теперь у вас есть ненормированная таблица, из которой вы можете делать быстрые запросы без соединений. Недостатком является то, что эта таблица должна время от времени обновляться, чтобы убедиться, что она синхронизирована с вашими реальными данными. В конечном счете, это хороший подход для исправления плохо спроектированной системы с тяжелыми запросами. Имеют смысл? –

0
  • содержит таблицы внешних ключей?

  • не использовать SELECT *, но присоединиться к таблице

может быть:

SELECT serial, table1.data1,table2.data2,table3.data3 FROM list 
LEFT JOIN table1 USING serial 
LEFT JOIN table2 USING serial 
LEFT JOIN table3 USING serial 
GROUP BY list.serial 
  • создавать ключи

возможно обрабатывать запросы отдельно и данные ссылка на PHP

+0

** serial ** одинаково среди всех таблиц, но они не назначены как внешние ключи, только первичные ключи для каждой таблицы. –

+0

Также мне нужно выбрать несколько записей из некоторых таблиц, поэтому мне нужно будет выбрать * их и группу их –

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