SQL-запрос занимает много времени для завершения - PullRequest
0 голосов
/ 04 мая 2018

У меня есть две реляционные таблицы, из которых мне обе нужны данные. Первая (основная) таблица содержит около 90 тыс. Строк. Вторичная таблица содержит около 200 тыс. Строк плюс.

Мне нужно добавить некоторые данные вторичной таблицы к результатам, которые я получаю из первой таблицы, в настоящее время я делаю это в двух частях:

Во-первых: я выбираю нужные строки из главной таблицы, это происходит очень быстро.

$records = getData($conn, "
SELECT id 
  from Main 
 where contains_tags is not null 
   and contains_mediums is not null 
   and contains_techniques is not null 
 limit 100
");

- Затем я перебираю каждую запись, чтобы добавить дополнительные данные из вторичной таблицы, но это занимает целую вечность (1 минута на 100 записей, 50 минут - 100 минут на записи 5 тыс. В конце мне нужно выполнить этот запрос для примерно 5-10 тыс. Строк Главный стол). Есть ли способ ускорить этот процесс?

foreach ($records as $r => $record) {
    $records[$r]['mediums'] = getData($conn, "SELECT medium from mediums where kleding_id = ".$record['id']."");
    kleding_id = ".$record['id']."");
}

Это желаемый результат после завершения обоих запросов:

[1] => Array
        (
            [id] => 15
            [mediums] => Array
                (
                    [0] => Array
                        (
                            [medium] => wol
                        )

                    [1] => Array
                        (
                            [medium] => katoen
                        )

                )

        )

Поэтому мой вопрос заключается в том, как эффективно запустить эту структуру запросов за минимальное время.

Основной стол выглядит так:
enter image description here
Вторичная таблица выглядит так:
enter image description here

Если что-то неясно, дайте мне знать, чтобы я мог уточнить.

Ответы [ 3 ]

0 голосов
/ 04 мая 2018

Если вам нужно улучшить производительность убедитесь, что у вас есть правильный столбец среды таблицы индекса kleding_id

CREATE INDEX my_index  ON mediums (kleding_id); 

помните, что предел (для не последней версии БД) обычно работает на результат ..a и не прерывается после достижения первых 100

0 голосов
/ 04 мая 2018

Вы можете сделать это одним запросом. Но это для MySQL Verison 5.7 и выше.

SELECT id, GROUP_CONCAT(json_object('medium', mediums.medium))
FROM Main
LEFT JOIN mediums ON Main.id = mediums.kleding_id
WHERE contains_tags IS NOT NULL AND contains_mediums IS NOT NULL AND contains_techniques IS NOT NULL
GROUP BY Main.id
LIMIT 100

Также убедитесь, что у вас есть индекс kleding_id.

0 голосов
/ 04 мая 2018

Нет необходимости перебирать первый результат и вызывать 2-ю таблицу несколько раз. Это всегда будет медленно.

Попробуйте inner join объединить данные из обеих таблиц в одном операторе sql.

SELECT
    Main.id,
    mediums.medium
from
    Main
inner join mediums on
    (
        Main.id = mediums.kleding_id
    )
where
    contains_tags is not null
    and contains_mediums is not null
    and contains_techniques is not null limit 100;
...