#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
Если у вас есть индексы. Вы можете попробовать запустить АНАЛИЗ имен таблиц в таблицах, чтобы обновить статистику таблиц