Заключване на заявка
- dakata__92
- Web-tourist
- Posts: 3359
- Joined: Tue Aug 02, 2011 7:24 pm
Заключване на заявка
Колеги, имам следния казус.
Имам една много тежка заявка, която трябва да извикам. Всичко е наред, тя си минава нормално. Искам, когато един потребител активира заявката за търсене, на всички останали потребители, които се опитат да пуснат същата заявка, да им изпиша, че трябва да изчакат вече пусната заявка от другия потребител да мине. Тоест не искам да се получи заключване на таблицата от едновременно пускане на 1 заявка да цикли от много хора. Мислех си да използвам Memcache и ако съществува стартиран рекуест да не позволявам на потребителите да правят нови заявки, докато тази не мине. Вие как бихте постъпили?
Имам една много тежка заявка, която трябва да извикам. Всичко е наред, тя си минава нормално. Искам, когато един потребител активира заявката за търсене, на всички останали потребители, които се опитат да пуснат същата заявка, да им изпиша, че трябва да изчакат вече пусната заявка от другия потребител да мине. Тоест не искам да се получи заключване на таблицата от едновременно пускане на 1 заявка да цикли от много хора. Мислех си да използвам Memcache и ако съществува стартиран рекуест да не позволявам на потребителите да правят нови заявки, докато тази не мине. Вие как бихте постъпили?
- dakata__92
- Web-tourist
- Posts: 3359
- Joined: Tue Aug 02, 2011 7:24 pm
Re: Заключване на заявка
Никой ли няма идея освен с мемкеш, как по друг културен начин да реша този проблем?
Re: Заключване на заявка
Резултатът на тази заявка никак ли не може да се кешира? Или заявката - оптимизира? Колко време отнема?
Re: Заключване на заявка
Ако заявката е една и съща е лесно ще кешираш. Колко да е голяма тази база че да се чака много или е на дискоче 5400, или няма рам машината. Ако искаш просто да не се променя нищо а да има опашка.
https://stackoverflow.com/questions/492 ... proceeding
https://codeburst.io/node-js-mysql-and- ... b25b01b628
Ако имаш памет apc https://www.php.net/apc_add
Може и с Memcached https://www.php.net/memcached
Може и на файлове https://pear.php.net/package/Cache https://pear.php.net/package/Cache_Lite
Всичко е според желанието и нуждите.
https://stackoverflow.com/questions/492 ... proceeding
https://codeburst.io/node-js-mysql-and- ... b25b01b628
Ако имаш памет apc https://www.php.net/apc_add
Може и с Memcached https://www.php.net/memcached
Може и на файлове https://pear.php.net/package/Cache https://pear.php.net/package/Cache_Lite
Всичко е според желанието и нуждите.
Re: Заключване на заявка
Дай да я видим тази заявка
- Revelation
- Web-tourist
- Posts: 922
- Joined: Sun Mar 24, 2013 1:23 pm
Re: Заключване на заявка
Колко е тежка тази заявка и в какво измерваш? Товар на процесора, заета памет?
Горе-долу колко време отнема трипа до базата данни?
Не може ли да се оптимизира заявката?
Това, което искаш да направиш е индикация за лош user experience. Щом това се получава, значи нещо не е наред, освен ако не е изискване към приложението.
Само не разбрах Memcache за какво ти е? Искаш да кешираш заявки или просто някъде да добавиш флаг, че е стартирана такава заявка. Ако е само за това, то и сесия ти стига да използваш.
Ако не е изискване, а само начин за замазване на положението, то се замислете за вертикално скалиране, или ако се налага хоризонтално.
В другата тема спомена, че имате репликация. Ако всичките сървъри не могат да се справят с това, значи или заявката иска сериозно оптимизиране, или сървърите ви искат ъпгрейд.
Няколко пъти си споменавал, че работите с много записи. Ако тези записи растат драстично, един и същи сетъп на базата данни не може да издържи вечно.
Горе-долу колко време отнема трипа до базата данни?
Не може ли да се оптимизира заявката?
Това, което искаш да направиш е индикация за лош user experience. Щом това се получава, значи нещо не е наред, освен ако не е изискване към приложението.
Само не разбрах Memcache за какво ти е? Искаш да кешираш заявки или просто някъде да добавиш флаг, че е стартирана такава заявка. Ако е само за това, то и сесия ти стига да използваш.
Ако не е изискване, а само начин за замазване на положението, то се замислете за вертикално скалиране, или ако се налага хоризонтално.
В другата тема спомена, че имате репликация. Ако всичките сървъри не могат да се справят с това, значи или заявката иска сериозно оптимизиране, или сървърите ви искат ъпгрейд.
Няколко пъти си споменавал, че работите с много записи. Ако тези записи растат драстично, един и същи сетъп на базата данни не може да издържи вечно.
- dakata__92
- Web-tourist
- Posts: 3359
- Joined: Tue Aug 02, 2011 7:24 pm
Re: Заключване на заявка
Тази заявка е за админ панел вече. Проблема, не е в това, че е тежка за сървърите, а в това, че таблицата постоянно бива попълвана. Говорим за голям дневен трафик и се налага да се прави справка какво постъпва на входа на системата. Желаем да избегнем заключване на таблицата заради пуснати няколко справки за голям период от време от съпорта. Заявката е откровено опростена:Revelation wrote: ↑Thu Apr 09, 2020 9:59 pmКолко е тежка тази заявка и в какво измерваш? Товар на процесора, заета памет?
Горе-долу колко време отнема трипа до базата данни?
Не може ли да се оптимизира заявката?
Това, което искаш да направиш е индикация за лош user experience. Щом това се получава, значи нещо не е наред, освен ако не е изискване към приложението.
Само не разбрах Memcache за какво ти е? Искаш да кешираш заявки или просто някъде да добавиш флаг, че е стартирана такава заявка. Ако е само за това, то и сесия ти стига да използваш.
Ако не е изискване, а само начин за замазване на положението, то се замислете за вертикално скалиране, или ако се налага хоризонтално.
В другата тема спомена, че имате репликация. Ако всичките сървъри не могат да се справят с това, значи или заявката иска сериозно оптимизиране, или сървърите ви искат ъпгрейд.
Няколко пъти си споменавал, че работите с много записи. Ако тези записи растат драстично, един и същи сетъп на базата данни не може да издържи вечно.
Code: Select all
SELECT column FROM table WHERE string LIKE '%text%' LIMIT 1
Та по самия въпрос, продължава да ми се върти идеята с мемкеш. Не съм сигурен дали това е откровено добро решение.
- dakata__92
- Web-tourist
- Posts: 3359
- Joined: Tue Aug 02, 2011 7:24 pm
Re: Заключване на заявка
Сървърите не са проблемни нито от към памет, нито от към сървърна мощ. Просто искам когато един потребител пусне заявката да не позволявам на останалите да пускат заявка към същата таблица, докато тази не мине.muti wrote: ↑Thu Apr 09, 2020 4:31 pmАко заявката е една и съща е лесно ще кешираш. Колко да е голяма тази база че да се чака много или е на дискоче 5400, или няма рам машината. Ако искаш просто да не се променя нищо а да има опашка.
https://stackoverflow.com/questions/492 ... proceeding
https://codeburst.io/node-js-mysql-and- ... b25b01b628
Ако имаш памет apc https://www.php.net/apc_add
Може и с Memcached https://www.php.net/memcached
Може и на файлове https://pear.php.net/package/Cache https://pear.php.net/package/Cache_Lite
Всичко е според желанието и нуждите.
Re: Заключване на заявка
Всяко търсене го запивай в базата в някаква таблица със статус отворено, като приключи го маркираш като затворено.
Така по всяко време ще можеш от тази таблица да видиш колко отворени търсения има и да ги ограничиш.
Така по всяко време ще можеш от тази таблица да видиш колко отворени търсения има и да ги ограничиш.
Re: Заключване на заявка
Ако заявката ти е с like '%dasda%' не се учудвам, че локваш цялата таблица. Това е нашина за търсене в малки бази данни. Бързо, лесно и удобно. Строго ти препоръчвам да помислиш за full text search. Ето няколко линка :
https://www.w3resource.com/mysql/mysql- ... ctions.php
https://makandracards.com/makandra/1281 ... ext-search

Дори и да имаш индекси на самата таблица, няма да можеш да постигнеш подобрение. Защото индекса се изгражда от началото към края на полето, а с процентите при търсенето ти прескачаш началото и края в началото и става положение когато нямаш индекс.
Или имаш много потребители или това не е цялата заявка която си показал по-горе и тя минава за повече от секунда. В този случай, кеша няма да помогне, защото той иска не кара машианта да изпълнява заявката отново и отново докато се изпълнява вече. Явно отнема много време. Да тротълнеш можеш пак с мемкеш да записваш заявката преди да е започнала да се изпълнява и да я чистиш, след като е минала. Ако вече тази заявка я има - да даваш някаква грешка. Но в това нещо виждам адски много който могат да възникнат. Да - мемкеша може би ще е по-бърз от базата данни, но прихващането на грешка е доста тежка операция и ще натовариш процесора супер много и излишно. Ако базата данни и изпълнението на кода са на една машина - тогава забавяш всичко.
Ако можеш да минеш към full text search направи го. Работи доста по-добре от like в смисъла на качествени ресултати, по-бързо и ефикасно.
Не мога да си представя случай, в който искаш дадена заявка /селект/ да не бъде изпълнена много пъти едновременно.
Това което можеш да направиш е да я заключиш за четене, да изпълниш селекта, да я отключиш.
https://dev.mysql.com/doc/refman/8.0/en ... ables.html
Примера който е даден в сайта, смятам, че точно това нещо искаш. Да я заключиш да не можеш да четеш, и след това да си я отключиш.
В този случай заявката, няма да мине, ще хвърли грешка която трябва да прихванеш при другите потребители.
https://www.w3resource.com/mysql/mysql- ... ctions.php
https://makandracards.com/makandra/1281 ... ext-search
Дори и да имаш индекси на самата таблица, няма да можеш да постигнеш подобрение. Защото индекса се изгражда от началото към края на полето, а с процентите при търсенето ти прескачаш началото и края в началото и става положение когато нямаш индекс.
Или имаш много потребители или това не е цялата заявка която си показал по-горе и тя минава за повече от секунда. В този случай, кеша няма да помогне, защото той иска не кара машианта да изпълнява заявката отново и отново докато се изпълнява вече. Явно отнема много време. Да тротълнеш можеш пак с мемкеш да записваш заявката преди да е започнала да се изпълнява и да я чистиш, след като е минала. Ако вече тази заявка я има - да даваш някаква грешка. Но в това нещо виждам адски много който могат да възникнат. Да - мемкеша може би ще е по-бърз от базата данни, но прихващането на грешка е доста тежка операция и ще натовариш процесора супер много и излишно. Ако базата данни и изпълнението на кода са на една машина - тогава забавяш всичко.
Ако можеш да минеш към full text search направи го. Работи доста по-добре от like в смисъла на качествени ресултати, по-бързо и ефикасно.
Не мога да си представя случай, в който искаш дадена заявка /селект/ да не бъде изпълнена много пъти едновременно.
Това което можеш да направиш е да я заключиш за четене, да изпълниш селекта, да я отключиш.
https://dev.mysql.com/doc/refman/8.0/en ... ables.html
Code: Select all
mysql> LOCK TABLE t READ;
mysql> SELECT * FROM t AS myalias;
ERROR 1100: Table 'myalias' was not locked with LOCK TABLES
В този случай заявката, няма да мине, ще хвърли грешка която трябва да прихванеш при другите потребители.