Почему вызов запроса в виде представления требует много дополнительного времени для выполнения?

#mysql #sql #performance #sql-view

Вопрос:

Вот мой запрос: ( 0.01 для выполнения требуется сек.):

 SELECT `pos_transactions`.`id`, 
       `psps`.`name` psp_or_club_name, 
        businesses.discount, 
        shop_name, 
        businesses.city_id, 
       `amount`,
       `transaction_date`, 
       `psp_id` , 
       `business_id`, 
       'pos' as `name`, 
       `daily_percentage`
FROM `pos_transactions`       
JOIN `businesses` 
  ON `business_id` = `businesses`.`id`
JOIN `business_sub_categories` 
  ON `businesses`.`sub_category_id` = `business_sub_categories`.`id`
LEFT JOIN `psps`  
  ON `psp_id` = `psps`.`id`

UNION ALL

SELECT `club_transactions`.`id`, 
       `clubs`.`name_fa`,
        psp_or_club_name, 
        businesses.discount,
        shop_name, 
        businesses.city_id,
       `amount`,
       `transaction_date`,
       `club_transactions`.`club_id` as `psp_id` ,
       `business_id`, 
       'club' as `name`, 
       `daily_percentage` 
FROM `club_transactions`
JOIN `businesses` 
  ON `business_id` = `businesses`.`id`
JOIN `business_sub_categories` 
  ON `businesses`.`sub_category_id` = `business_sub_categories`.`id`
LEFT JOIN `clubs`  
  ON `club_transactions`.`club_id` = `clubs`.`id`
where `club_transactions`.`status` = "paid"
 

Мне нужно сделать view это, и они называют это в разных местах. Поэтому я создаю представление таким образом:

 CREATE VIEW myview AS ( <query above> )
 

А затем используйте его вот так:

 SELECT * FROM myview 
 

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


И вот результат EXPLAIN :

введите описание изображения здесь

Комментарии:

1. Вам необходимо создать правильные индексы в таблицах для столбцов.

2. @Mansoor Ну, также создаются необходимые индексы . Поскольку запрос выполняется примерно 0.1 за секунду, это приемлемо для меня. Текущая проблема в том, что это занимает много времени, когда я делаю view это.

3. В этом случае вы также можете добавить план запроса? explain analyze select * from myview

4. А также какие все индексы вы добавили?

5. @Мансур Результат explain добавления

Ответ №1:

  • 3 секунды для 280 тысяч строк-неплохо.
  • 0,01 сек для 280 тыс. строк-похоже, кэш запросов включен, и он искал результат, фактически не оценивая его. Повторите его после добавления SQL_NO_CACHE сразу после каждого SELECT .
  • Первый SELECT не имеет фильтрации, поэтому он обязан извлекать 280 тыс. строк.
  • pos_transactions и club_transactions кажутся почти идентичными. Я предлагаю вам объединить их в одну transactions таблицу. Это, вероятно, поможет оптимизатору лучше выполнять свою работу.

Для дальнейшего обсуждения, пожалуйста, укажите SHOW CREATE TABLE для каждой таблицы размеры таблиц.

Объяснение

0,01 сек-это фальшивка! Пользовательский интерфейс, добавленный LIMIT 24 в запрос перед его запуском. Это позволило ему остановиться перед выполнением всей работы, поэтому он работал довольно быстро.

Комментарии:

1. Я протестировал, он не использует кэш и по-прежнему быстр даже при использовании SQL_NO_CACHE . Пожалуйста, взгляните на это

2. Хммм… Это, пожалуй, единственный случай, когда показ изображения (вместо текста) помог разгадать тайну. (Я добавил к своему Ответу.)

Ответ №2:

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

Ответ №3:

Убедитесь, что у вас есть индекс на

  • pos_transactions.business_id
  • businesses.sub_category_id
  • pos_transactions.psp_id
  • club_transactions.business_id
  • club_transactions.status

Если у вас есть индексы. Вы можете попробовать запустить АНАЛИЗ имен таблиц в таблицах, чтобы обновить статистику таблиц