BG Development


Страници: (2) [1] 2   ( Първото ново мнение ) Reply to this topicStart new topicStart Poll

> Брой селектирани редове и LIMIT ограничение
emagi
Публикувано на: 21-05-2021, 13:40
Quote Post



Име:
Група: Потребител
Ранг: Редовен член

Мнения: 544
Регистриран на: 12.03.07



Здравейте,

да поясня какво искам да направя:
Frontend - Angular
Backend - PHP
Database - MariaDB

Не питайте, защо съм избрал PHP + MariaDB. icon_lol.gif:D:D:D
Ако проекта си заслужава, ще смяна с @Nest + Mongo
Имам API Rest, който връща търсени обяви. Като request param пращам и paging(LIMIT).
Искам да върна обявите, броят им + лимитация.
Та и от там проблема: изчитам всички филтри(request params) и създавам MariaDb Where заявката.
Преди да стигна до LIMIT, изпълнявам заявката и преброявам редовете, за да дам Инфо на потребителя колко обяви са намерени по зададените от него критерии. След това изпълнявам още веднъж заявката с LIMIT и връщам само тези редове, който трябват за страницирането.
CODE
echo $this->serialize(array("count" => $count, "offers" => $offers));

Разликата с преборяване и без такова са 700 ms, която е много.
Нормално(без преброяване) Rest API-то отговоря за около 70 до 120 ms, което е добре

Има ли някакъв трик(workarround), с който може да се направи нещо по въпроса?
Идея би било, да изпълня двете заявка асинхронно, но не знам как PHP работи с Threats, дали изобщо е възможно това

Това мнение е било редактирано от emagi на 21-05-2021, 13:43
PMEmail Poster
Top
enf
Публикувано на: 21-05-2021, 13:54
Quote Post



Име:
Група: Потребител
Ранг: Посетител

Мнения: 54
Регистриран на: 01.08.14



CTE, Window function или UNION 2 селекта, като първи/последен запис от дейтасета ще ти е "служебен"
PMEmail Poster
Top
thrawn
Публикувано на: 21-05-2021, 13:56
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 3098
Регистриран на: 17.01.17



Ми не пускай две заявки...
Пусни count(*) като window функция в основната заявка.

Да не говорим, че ако гониш производителност трябва да забравиш за offset
PMEmail Poster
Top
emagi
Публикувано на: 21-05-2021, 14:00
Quote Post



Име:
Група: Потребител
Ранг: Редовен член

Мнения: 544
Регистриран на: 12.03.07



Идеята с Common Table Expression ми харесва. Не знаех, че MariaDb го поддържа. Сега ще пробвам
PMEmail Poster
Top
emagi
Публикувано на: 21-05-2021, 14:01
Quote Post



Име:
Група: Потребител
Ранг: Редовен член

Мнения: 544
Регистриран на: 12.03.07



QUOTE (thrawn @ 21-05-2021, 13:56)
Ми не пускай две заявки...
Пусни count(*) като window функция в основната заявка.

Да не говорим, че ако гониш производителност трябва да забравиш за offset

Ще пробвам и това
PMEmail Poster
Top
badsnake
Публикувано на: 21-05-2021, 14:02
Quote Post


Group Icon
Име: Станислав Филев
Група: VIP
Ранг: Активен

Мнения: 294
Регистриран на: 10.04.04



По добре ще е да си направиш две заявки едната за count а другата за данните с лимитирането.
Пример;
CODE

SELECT count(*) FROM table WHERE id > 10

и втората заявка за данните ще е
CODE

SELECT * FROM table WHERE id > 10 limit 50


Заявката за count би трябвало да се изпълни бързо.


--------------------
Преди всичко същност, отколкото външност!!!
PMEmail PosterUsers WebsiteICQ
Top
Bender++
Публикувано на: 22-05-2021, 17:56
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 7
Регистриран на: 18.04.21



Защо всички ползват  LIMIT вместо правоверното FETCH FIRST xxx ROWS ONLY|WITH TIES ?

Това мнение е било редактирано от Bender++ на 22-05-2021, 17:58
PMEmail Poster
Top
enf
Публикувано на: 22-05-2021, 23:27
Quote Post



Име:
Група: Потребител
Ранг: Посетител

Мнения: 54
Регистриран на: 01.08.14



Ами вероятно така са го намерили за сефте в SO и така са свикнали

пп
иначе по темата, аз бих заложил на пръв поглед на "най-бавния" вариант - ще нашия селекта през CTЕ (за да си спестя писането) и после един UNION с агрегата. Всяко по-свястно субд ще се усети и униона ще ми е безплатен (така си мисля), щото така или иначе вече ще е сканирал целия индекс(и). Window функцията изглежда "най-хитра", ама залагам 50 лв, че ще избичи IO да си ебе.

Това мнение е било редактирано от enf на 22-05-2021, 23:40
PMEmail Poster
Top
thrawn
Публикувано на: 23-05-2021, 05:56
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 3098
Регистриран на: 17.01.17



QUOTE (Bender++ @ 22-05-2021, 17:56)
Защо всички ползват  LIMIT вместо правоверното FETCH FIRST xxx ROWS ONLY|WITH TIES ?

Какво значи правоверно?
Limit се поддържа на всякъде а fetch не. Но така или иначе, как ще лимитираш изходът е без значение. При тази клауза проблемната част е offset -ът .
PMEmail Poster
Top
sailer
Публикувано на: 23-05-2021, 09:27
Quote Post



Име: Александър Георгиев
Група: Потребител
Ранг: Почетен член

Мнения: 2567
Регистриран на: 15.01.07



Има готов механизъм за това обаче не е native sql, а специфичен за mysql/mariadb. Потърси за SQL_CALC_FOUND_ROWS и FOUND_ROWS().


--------------------
But when I taste rakija
In my head anarhija
PMEmail Poster
Top
1 потребители преглеждат тази тема в момента (1 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Страници: (2) [1] 2  Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2019 | BG Development | All Rights Reserved
RSS 2.0