Извлечение огромного количества данных с использованием MySQL - PullRequest
0 голосов
/ 03 февраля 2020

У меня база данных состоит из 7 таблиц и каждая таблица содержит миллионы записей. Я пытаюсь получить данные из разных таблиц, используя агрегатные функции и предложение JOIN. Я использую MySQL Workbench и phpMyAdmin для выполнения запросов.

Проблема в том, что я не могу получить данные, даже когда я ограничиваю количество записей. Однако, когда я указываю идентификаторы необходимых записей для извлечения, он работает нормально. Например:

select avg(grade) 
from TableA 
inner join TableB on TableA.ID = TableB.ID limit 5;

Если я использовал вышеупомянутый запрос, MySQL перестанет работать до потери соединения с сервером.

select avg(grade) 
from TableA 
inner join TableB on TableA.ID = TableB.ID 
where TableA.ID = 1 OR TableA.ID = 2 .... to 5

В последнем запросе MySQL вернет требуемый результат.

Я хотел бы оптимизировать эти запросы, если смогу, вместо увеличения времени ожидания сервера.

1 Ответ

0 голосов
/ 04 февраля 2020

В ваших примерах запросов:

  1. Читать все из одной таблицы. Или меньше «all», если есть полезное предложение WHERE. (Ни в одном из ваших случаев.)
  2. Для каждой строки в этой таблице найдите соответствующие строки в следующей таблице. При этом используются предложения ON и WHERE, если это уместно. (У вас есть ON, но ни у одного запроса нет пригодного для использования WHERE; см. Ниже.)
  3. Это дает вам большую временную таблицу.
  4. Выполните любую другую фильтрацию, например WHERE .. OR ...
  5. Выполнить агрегацию.
  6. Сортировать результат. О, нет ORDER BY.
  7. Доставить несколько строк, основываясь на LIMIT.

То есть большая часть усилий происходит до LIMIT. (Есть случаи, когда INDEX может быть эффективен даже в LIMIT, но не в ваших примерах.)

В какой таблице grade? Это действительно дает вам правильный ответ? Находятся ли две таблицы в соотношении 1: 1 или 1: много? Если 1: много, разве вы не должны делать AVG против одной из таблиц, , тогда делать JOIN? Примечание: это ускорит процесс. Пожалуйста, укажите SHOW CREATE TABLE, чтобы я мог помочь вам в дальнейшем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...