2015-07-21 3 views
0

Я использую большой выбор в нескольких таблицах, где у меня много строк, я должен сказать вам, что таблица не связана. Мне нужно извлечь каждый из них и добавить в массив.Mysql: Лучшая практика для извлечения не связанных данных в multiTable

Моя проблема:

Когда я использую это:

mysql> select w.*,s.*,p.*,h.*,c.*,b.*,o.* from 
     `base` b,`chain` c,`house` h, 
     `option` o,`piece` p,systems s, 
     `wall` w; 

Иногда я получил это после выполнения запроса:

ERROR 2008 (HY000): MySQL client ran out of memory

Это займет около 1minutes, чтобы выполнить эту функцию и что-то вроде 1min40 для результата массива выборки.

И после этого, мне нужно использовать что-то вроде:

$base = $chain = 
$house = $option= 
$piece= $systems = 
$wall = array(); 
while($row = $data->fetch_array(MYSQLI_ASSOC)) { 
    //build all array properly 
} 

это можно сократить выполнение времени? Лучше использовать 1 запрос для каждой таблицы, которую мне нужно извлечь, и нажать строку в «хороший» массив?

Благодаря

** EDIT **

Я также попытался это, но samething:

mysql> select w.*,s.*,p.*,h.*,c.*,b.*,o.* from 
     `base` b INNER JOIN `chain` c INNER JOIN `house` h INNER JOIN 
     `option` o INNER JOIN `piece` p INNER JOIN systems s INNER JOIN 
     `wall` w; 
+0

Вы просто пытаетесь получить все данные из каждой из этих таблиц или есть веская причина, по которой вы используете декартовое соединение? –

+0

Извините, я хочу получить таблицу 1, помещенную в массив 1, все строки, все столбцы, таблицу 2 в массив 2 ... и т. Д. Я не уверен, что если запрос 7 или 8 раз больше, или мне нужно свести к минимуму его. Но мой текущий SQL использует много памяти и требует времени. –

ответ

2

Вы должны сделать запрос для каждой таблицы.

Вопрос, который вы упомянули, представляет собой декартовое соединение, которое почти наверняка не то, что вы хотите. В картезианском соединении каждая строка будет иметь данные из каждой таблицы, а полные строки будут являться продуктом полных строк каждой таблицы (т. Е. Если каждая таблица имеет 10 строк, запрос вернет 10 000 000 строк). У сценария заканчивается память, потому что ваш запрос извлекает много раз больше данных, чем вы действительно интересуетесь или используете.

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

+0

да! правда!. спасибо за Ваш ответ! Мне нужно '$ data-> free();' после каждого запроса? или если я переопределю '$ data', я могу все-таки сделать? –

+0

После каждого запроса вам не нужно вызывать 'free()'. Он будет очищен автоматически, когда нет ссылок на данные. Если вы переписываете '$ data' для каждого запроса, это будет делать иначе, вы можете' unset() 'переменные, когда вы закончите с ними, но вы, вероятно, не должны _need_. –

0

Если вы не используете присоединиться с заявлением или вступить в где ПОСТАНОВКА mysql делает все изменения из этих таблиц строк, и это приводит к повреждению памяти! Если вы присоединились к этим таблицам, вы не получите сообщение об ошибке.

+0

, но у меня нет 'ID_объекта' для связывания таблицы. Поэтому я не могу использовать' 'ON'', тоже нормально? –

+0

, тогда вы можете запросить по одному за столами –

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