| BG Development · За реклама · За контакти |
Помощ Търсене Потребители Календар Правила |
| Здравей! ( Включване | Регистриране ) |
| Страници: (2) [1] 2 ( Първото ново мнение ) | ![]() ![]() ![]() |
| emagi |
Публикувано на: 21-05-2021, 13:40
|
||
![]() Име: Група: Потребител Ранг: Редовен член Мнения: 565 Регистриран на: 12.03.07 |
Здравейте, да поясня какво искам да направя: Frontend - Angular Backend - PHP Database - MariaDB Не питайте, защо съм избрал PHP + MariaDB. Ако проекта си заслужава, ще смяна с @Nest + Mongo Имам API Rest, който връща търсени обяви. Като request param пращам и paging(LIMIT). Искам да върна обявите, броят им + лимитация. Та и от там проблема: изчитам всички филтри(request params) и създавам MariaDb Where заявката. Преди да стигна до LIMIT, изпълнявам заявката и преброявам редовете, за да дам Инфо на потребителя колко обяви са намерени по зададените от него критерии. След това изпълнявам още веднъж заявката с LIMIT и връщам само тези редове, който трябват за страницирането.
Разликата с преборяване и без такова са 700 ms, която е много. Нормално(без преброяване) Rest API-то отговоря за около 70 до 120 ms, което е добре Има ли някакъв трик(workarround), с който може да се направи нещо по въпроса? Идея би било, да изпълня двете заявка асинхронно, но не знам как PHP работи с Threats, дали изобщо е възможно това Това мнение е било редактирано от emagi на 21-05-2021, 13:43 |
||
| enf |
Публикувано на: 21-05-2021, 13:54
|
|
Име: Група: Потребител Ранг: Посетител Мнения: 55 Регистриран на: 01.08.14 |
CTE, Window function или UNION 2 селекта, като първи/последен запис от дейтасета ще ти е "служебен"
|
| thrawn |
Публикувано на: 21-05-2021, 13:56
|
![]() Име: Група: Потребител Ранг: Почетен член Мнения: 3864 Регистриран на: 17.01.17 |
Ми не пускай две заявки...
Пусни count(*) като window функция в основната заявка. Да не говорим, че ако гониш производителност трябва да забравиш за offset |
| emagi |
Публикувано на: 21-05-2021, 14:00
|
![]() Име: Група: Потребител Ранг: Редовен член Мнения: 565 Регистриран на: 12.03.07 |
Идеята с Common Table Expression ми харесва. Не знаех, че MariaDb го поддържа. Сега ще пробвам
|
| emagi |
Публикувано на: 21-05-2021, 14:01
|
||
![]() Име: Група: Потребител Ранг: Редовен член Мнения: 565 Регистриран на: 12.03.07 |
Ще пробвам и това |
||
| badsnake |
Публикувано на: 21-05-2021, 14:02
|
||||
![]() Име: Станислав Филев Група: VIP Ранг: Редовен член Мнения: 301 Регистриран на: 10.04.04 |
По добре ще е да си направиш две заявки едната за count а другата за данните с лимитирането. Пример;
и втората заявка за данните ще е
Заявката за count би трябвало да се изпълни бързо. -------------------- Преди всичко същност, отколкото външност!!!
|
||||
| Bender++ |
Публикувано на: 22-05-2021, 17:56
|
![]() Име: Група: Потребител Ранг: Старо куче Мнения: 608 Регистриран на: 18.04.21 |
Защо всички ползват LIMIT вместо правоверното FETCH FIRST xxx ROWS ONLY|WITH TIES ?
Това мнение е било редактирано от Bender++ на 22-05-2021, 17:58 -------------------- Слава на Цар Путин! Долу украинските фашисти!
|
| enf |
Публикувано на: 22-05-2021, 23:27
|
|
Име: Група: Потребител Ранг: Посетител Мнения: 55 Регистриран на: 01.08.14 |
Ами вероятно така са го намерили за сефте в SO и така са свикнали
пп иначе по темата, аз бих заложил на пръв поглед на "най-бавния" вариант - ще нашия селекта през CTЕ (за да си спестя писането) и после един UNION с агрегата. Всяко по-свястно субд ще се усети и униона ще ми е безплатен (така си мисля), щото така или иначе вече ще е сканирал целия индекс(и). Window функцията изглежда "най-хитра", ама залагам 50 лв, че ще избичи IO да си ебе. Това мнение е било редактирано от enf на 22-05-2021, 23:40 |
| thrawn |
Публикувано на: 23-05-2021, 05:56
|
||
![]() Име: Група: Потребител Ранг: Почетен член Мнения: 3864 Регистриран на: 17.01.17 |
Какво значи правоверно? Limit се поддържа на всякъде а fetch не. Но така или иначе, как ще лимитираш изходът е без значение. При тази клауза проблемната част е offset -ът . |
||
| sailer |
Публикувано на: 23-05-2021, 09:27
|
|
Име: Александър Георгиев Група: Потребител Ранг: Почетен член Мнения: 2572 Регистриран на: 15.01.07 |
Има готов механизъм за това обаче не е native sql, а специфичен за mysql/mariadb. Потърси за SQL_CALC_FOUND_ROWS и FOUND_ROWS().
-------------------- But when I taste rakija
In my head anarhija |
Страници: (2) [1] 2 |
![]() ![]() ![]() |