Здравствуйте Гость [ Вход | Регистрация ] | Форум в сети 6726-й день

Шановні користувачі! Запрошуємо вас до офіційного телеграм-канала 0day Community. Тут ви зможете поспілкуватися одне з одним та дізнатися про останні новини щодо роботи ресурса, поставити запитання до адміністрації, тощо. Перейти до телеграм-канала можна відсканувавши QR-код або натиснувши на посилання: @zeroday_ua

 помогите оптимизировать SQL запрос, mysql

Navern
Jun 25 2018, 17:33
  
Пост #1



Репутация:   552  
Aut vincere , aut mori
****

Группа: Пользователи
Сообщений: 2 861
С нами с: 10-October 06


Добрый день. Нужно оптимизировать данный SQL запрос.


SELECT
    `transaction`.*
FROM
    `transaction`
    LEFT JOIN `transaction_2` ON `transaction`.`id` = `transaction_2`.`transaction_id`
WHERE
    transaction.deleted IS NULL
    AND
    (SELECT SUM(summ) FROM transaction_2 WHERE transaction_id = transaction.id) IS NULL
    OR transaction.summ - (SELECT SUM(summ) FROM transaction_2 WHERE transaction_id = transaction.id) <> 0


Удалось немного улучшить показатели, но не сильно.


SELECT
  transaction.id,
  transaction.summ,
  SUM(transaction_2.summ)
FROM transaction
LEFT JOIN transaction_2 ON transaction.id = transaction_2.transaction_id
WHERE transaction.deleted IS NULL
GROUP BY transaction.id
HAVING SUM(transaction_2.summ) IS NULL OR SUM(transaction_2.summ) <> transaction.summ


Кто-то может помочь? blush.gif
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
 
Reply to this topicStart new topic
Ответов(1 - 8)
revolver
Jun 25 2018, 19:13
  
Пост #2



Репутация:   1344  
ultra active user
******

Группа: BANNED
Сообщений: 33 534
С нами с: 2-June 08


тут особо нечего оптимизировать
убедись, что колонки id в обеих таблицах это pk (primary key), желательно кластерный
если нет и нельзя кластерный - построй некластерный (уникальный, если данные позволяют) по id с инклюдом summ, а на первой таблице - +deleted
запрос можно написать и так, но это те же яйца, только в профиль
WITH
  A AS (SELECT id, summ FROM transaction WHERE deleted IS NULL),
  B AS (SELECT id, SUM(summ) summ FROM transaction_2 GROUP BY id)
SELECT A.id, A.summ, B.summ FROM A LEFT JOIN B ON A.id=B.id AND (B.summ IS NOT NULL OR A.summ<>B.summ);


или так:
WITH
  A AS (SELECT id, summ FROM transaction WHERE deleted IS NULL),
  B AS (SELECT id, SUM(summ) summ FROM transaction_2 WHERE SUM(summ) IS NOT NULL GROUP BY id)
SELECT A.id, A.summ, B.summ FROM A LEFT JOIN B ON A.id=B.id AND A.summ<>B.summ;


Сообщение отредактировал revolver - Jun 25 2018, 19:14
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Navern
Jun 25 2018, 19:27
  
Пост #3



Репутация:   552  
Aut vincere , aut mori
****

Группа: Пользователи
Сообщений: 2 861
С нами с: 10-October 06


(revolver @ Jun 25 2018, 20:13) Перейти к цитате

убедись, что колонки id в обеих таблицах это pk (primary key), желательно кластерный


это сделано, но не решает проблему скорости sad.gif

а WITH с какой версией MYSQL работает?
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
revolver
Jun 28 2018, 19:51
  
Пост #4



Репутация:   1344  
ultra active user
******

Группа: BANNED
Сообщений: 33 534
С нами с: 2-June 08


https://dev.mysql.com/doc/refman/8.0/en/with.html
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Navern
Jul 2 2018, 15:51
  
Пост #5



Репутация:   552  
Aut vincere , aut mori
****

Группа: Пользователи
Сообщений: 2 861
С нами с: 10-October 06


у меня MYSQL 5.6
есть еще варианты?
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
revolver
Jul 2 2018, 16:28
  
Пост #6



Репутация:   1344  
ultra active user
******

Группа: BANNED
Сообщений: 33 534
С нами с: 2-June 08


(Navern @ Jul 2 2018, 16:51) Перейти к цитате
у меня MYSQL 5.6
есть еще варианты?
https://mariadb.com/kb/en/library/with/
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Navern
Aug 7 2018, 19:13
  
Пост #7



Репутация:   552  
Aut vincere , aut mori
****

Группа: Пользователи
Сообщений: 2 861
С нами с: 10-October 06


(revolver @ Jul 2 2018, 17:28) Перейти к цитате


у меня именно MySQL, а не MariaDB.
можно как-то ваш запрос переделать без использования WITH
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Pradromalo
Nov 9 2018, 1:07
  
Пост #8



Репутация:   26  
Активист
*

Группа: Пользователи
Сообщений: 366
С нами с: 2-April 09


--

Сообщение отредактировал Pradromalo - Nov 9 2018, 1:08
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
tano-yastreb
Dec 30 2018, 23:01
  
Пост #9



Репутация:   103  
Старожил
****

Группа: Пользователи
Сообщений: 2 523
С нами с: 9-February 14


(Navern @ Aug 7 2018, 19:13) Перейти к цитате

у меня именно MySQL, а не MariaDB.
можно как-то ваш запрос переделать без использования WITH


МарияДБ этот тот же мускуль только облегченный и оптимизированный. По моим личным наблюдениям работает где-то на 20% быстрее обычного мускуля. Тестил на портале с посещалкой 1200 хостов и парой специализированых скриптов.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post

Reply to this topicStart new topic

 



- Упрощённая версия
Сейчас: 14th August 2024 - 12:11
Сайт не розміщує електронні версії творів, а займається лише колекціонуванням та каталогізацією посилань, що публікуються нашими користувачами. Якщо Ви є правовласником якоїсь частини опублікованого матеріалу та не бажаєте, щоб посилання на нього знаходилось в нашому каталозі, зв’яжіться з нами і ми видалимо його. Файли для обміну надані користувачами сайту і адміністрація не несе відповідальності за їх вміст.