ускорение MySQL запросов в PHP - PullRequest
0 голосов
/ 28 мая 2020

У меня есть таблица с более чем 21 889 464 строками, и я выполняю 6 этих запросов при загрузке страницы.

$woReleased = $database->query("SELECT COUNT(*) as Count FROM (select * from workflow
where action_name = 'Released'
and release_date >= '$startPrevMonth' 
and release_date <= '$endPrevMonth' 
AND project_name = 'tims' group by page_id, headline, release_full_name, release_date
) workflow")->fetchAll();
$c_woReleased = $woReleased[0]["Count"];

проблема в том, что когда я запускаю 6 из них при загрузке страницы в PHP, для возврата результатов требуется примерно 14 секунд.

единственная разница между приведенными выше а остальные 5 запросов в основном имеют разные action_name и project_name.

любая помощь для ускорения будет принята с благодарностью.

это структура моей таблицы.

enter image description here

Ответы [ 2 ]

1 голос
/ 28 мая 2020
select page_id
     , action_name
     , project_name
     , headline
     , release_full_name
     , release_date 
     , count(*) count
  from workflow
 where (action_name, project_name) IN((:action_name,:project_name))
   and release_date >= :startPrevMonth
   and release_date <= :endPrevMonth
 group 
    by action_name
     , project_name
     , page_id
     , headline
     , release_full_name
     , release_date

Индекс для некоторой комбинации (action_name, release_date, project_name) показался бы разумным (хотя я не уверен, что MySQL может использовать индекс, когда IN () используется таким образом), и, да см. о подготовленных и связанных запросах

0 голосов
/ 28 мая 2020

Я согласен с комментариями Саммитча - подготовленные операторы - это способ go здесь, и действительно кеширование, но кеширование, похоже, не является вариантом в этом случае. Кроме того, с помощью SELECT * вы сразу извлекаете все данные из таблицы, что замедляет выполнение запроса. Вам действительно нужно вытащить каждый столбец, или вы можете быть более избирательным?

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

1.) Для первого запроса просто верните минимальный минимум, который вам нужен.

2.) Если есть Требование просмотреть более подробный образец, а затем позволить пользователю выбрать запись или записи, которые содержат всю необходимую информацию.

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