A small thing that brings huge help.
The other day I was writing some code to process a very large amount of items coming from a social media API. My items were ending in a queue in MySQL and then needed to be processed and eventually moved.
The task was not so strange, but what I have to do is to develop a queue processor. Now when you need to process a queue you have two types of queue: static and dynamic.
The static comes in a batch of N number of items in a given time interval and is normally easier to process given you have a defined number of items that you can split in chunks and process in parallel.
The dynamic is… well... more challenging. One option is to wait to have a predefined number of items, and then process them as if they were a static queue.
But this approach is not very good, given it is possible that it will delay a lot the processing of an item for all the time it has to wait to reach the desired queue’s size.
The other possibility is to have the processing jobs work on a single item and not in chunk/batch. But, this is not optimal when given the chance to process a queue in batch to speed up the processing time.
My incoming queue is a bit unpredictable, a mix of fixed sizes and a few thousand coming sparse, without a clear interval. So I was there thinking on how to process this and already starting to design a quite complex mechanism to dynamically calculate the size of the possible chunks and the number of jobs, when…
An aside: some colleagues know my habit to read the whole MySQL manual, from A to Z, at least once a year. It's a way for me to review what is going on and sometimes to dig in more in some aspects. This normally also gives me a good level of confidence about new features and other changes on top of reading the release notes.
...When … looking at the documentation for something else, my attention was captured by:
“To avoid waiting for other transactions to release row locks, NOWAIT and SKIP LOCKED options may be used with SELECT ... FOR UPDATE or SELECT ... FOR SHARE locking read statements.”
Wait - what???
Let me dig in a bit:
“SKIP LOCKED. A locking read that uses SKIP LOCKED never waits to acquire a row lock. The query executes immediately, removing locked rows from the result set.”
Wow, how could I have missed that?
It was also not new but in MySQL 8.0.1, the milestone release. Having experience with Oracle, I knew what SKIP LOCKED does and how to use it. But I was really not aware that it was also available in MySQL.
In short, SKIP LOCKED allows you to lock a row (or set of them), bypassing the rows already locked by other transactions.
The classic example is:
# Session 1: mysql> CREATE TABLE t (i INT, PRIMARY KEY (i)) ENGINE = InnoDB; mysql> INSERT INTO t (i) VALUES(1),(2),(3); mysql> START TRANSACTION; mysql> SELECT * FROM t WHERE i = 2 FOR UPDATE; +---+ | i | +---+ | 2 | +---+ # Session 2: mysql> START TRANSACTION; mysql> SELECT * FROM t FOR UPDATE SKIP LOCKED; +---+ | i | +---+ | 1 | | 3 | +---+
But what is important for me is that given an N number of jobs running, I can bypass all the effort of calculating the dynamic chunks, given that using SKIP LOCKED that will happen as well, if in a different way.
All good, but what performance will I have using SKIP LOCK in comparison to the other two solutions?
I have run the following tests on my laptop, so not a real server, and used a fake queue processor I wrote on the fly to test the things you can find on GitHub here.
What I do is to create a table like this:
CREATE TABLE `jobs` ( `jobid` int unsigned NOT NULL AUTO_INCREMENT, `time_in` bigint NOT NULL, `time_out` bigint DEFAULT '0', `worked_time` bigint DEFAULT '0', `processer` int unsigned DEFAULT '0', `info` varchar(255) DEFAULT NULL, PRIMARY KEY (`jobid`), KEY `idx_time_in` (`time_in`,`time_out`), KEY `idx_time_out` (`time_out`,`time_in`), KEY `processer` (`processer`) ) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci
Then I will do three different methods of processing:
- Simple process, reading and writing a row a time
- Use chunks to split my queue
- Use SKIP LOCKED
To clarify the difference existing between the 3 different way of processing the queue let us use 3 simple images:

In simple processing each row represent a possible lock that the other processes must wait for.

In chunk processing given each process knows what records to lock they can go in parallel.

In SKIP LOCKED also if each process have no idea of what rows they need to lock, is enough to say the size of the chunk, and MySQL will return the records available.
I will repeat the tests for a static queue, and after for a dynamic queue for 20 seconds. Let's see what happens.
Test one - simple processing and static queue:
queue Processor report: ========================= Start Time = Tue Jul 28 13:28:25 CEST 2020 End Time = Tue Jul 28 13:28:31 CEST 2020 Total Time taken(ms) = 6325.0 Number of jobs = 5 Number of Items processed = 15000 Avg records proc time = 220308
Test 2 use the chunks and static queue
Chunk no loop -------------- queue Processor report: ========================= Start Time = Tue Jul 28 13:30:18 CEST 2020 End Time = Tue Jul 28 13:30:22 CEST 2020 Total Time taken(ms) = 4311.0 Number of jobs = 5 Number of Items processed = 15000 Avg records proc time = 391927
Test three - use SKIP LOCKED and static queue:
SKIP LOCK - no loop ------------------------ queue Processor report: ========================= Start Time = Tue Jul 28 13:32:07 CEST 2020 End Time = Tue Jul 28 13:32:11 CEST 2020 Total Time taken(ms) = 4311.0 Number of jobs = 5 Number of Items processed = 15000 Avg records proc time = 366812
So far, so good.
Time is almost the same (actually in this test, it's exactly the same), normally fluctuating a bit up and down by a few ms.
Average execution by commit fluctuates a bit:

Here, the base execution is faster for the simple reason that the application is processing one record against a batch of records of the other two.
Now it is time to see what happens if instead of a static batch, I have a process that fills the queue constantly. If you want picture what will happen on each test, just imagine this:
- Some pipes will put water in a huge tank
- The base solution will try to empty the tank using a small glass of water but acting very fast at each run
- With Chunk it will wait for the water to reach a specific level, then will use a fixed-size bucket
- Using SKIP LOCK, it will constantly look at the tank and will choose the size of the bucket based on the quantity of the water present.
To simulate that, I will use five threads to write new items, five to process the queue, and will run the test for 20 seconds.
Here we will have some leftovers; that is how much water remains in the tank because the application was not emptied with the given bucket. We can say it is a way to measure the efficiency of the processing, where the optimal sees the tank empty.
Test one - simple processing and static queue:
Basic no loop -------------- queue Processor report: ========================= Start Time = Tue Jul 28 13:42:37 CEST 2020 End Time = Tue Jul 28 13:43:25 CEST 2020 Total Time taken(ms) = 48586.0 Number of jobs = 5 Number of Items processed = 15000 Total Loops executed (sum)= 85 Avg records proc time = 243400 Leftover +----------+------------+ | count(*) | max(jobId) | +----------+------------+ | 143863 | 225000 | +----------+------------+
Test 2 use the chunks and static queue:
Chunk no loop -------------- queue Processor report: ========================= Start Time = Tue Jul 28 13:44:56 CEST 2020 End Time = Tue Jul 28 13:45:44 CEST 2020 Total Time taken(ms) = 47946.0 Number of jobs = 5 Number of Items processed = 15000 Total Loops executed (sum)= 70 Avg records proc time = 363559 Leftover +----------+------------+ | count(*) | max(jobId) | +----------+------------+ | 53 | 195000 | +----------+------------+
Test 3 use SKIP LOCKED and static queue:
queue Processor report: ========================= Start Time = Tue Jul 28 14:46:45 CEST 2020 End Time = Tue Jul 28 14:47:32 CEST 2020 Total Time taken(ms) = 46324.0 Number of jobs = 5 Number of Items processed = 15000 Total Loops executed (sum)= 1528 Avg records proc time = 282658 Leftover +----------+------------+ | count(*) | max(jobId) | +----------+------------+ | 0 | NULL | +----------+------------+
Here, the scenario is a bit different than the one we had with the static queue.

Here, the scenario is a bit different than the one we had with the static queue.

Record processing when comparing by chunk and SKIP LOCK is again more efficient in the second one. This is because it optimizes the size of the “bucket” and given that it can sometimes process fewer records per loop.

As we can see when using SKIP LOCK, the application was able to execute 1528 loops to process the queue against the 70 of the chunk and 85 of the basic approach.
In the end, the only one that was able to empty the tank was the solution with SKIP LOCK.
Conclusion
Processing queues can be simple when we need to process a fixed number of items, but if you need an adaptive approach, then the situation changes. You can find yourself writing quite complex algorithms to optimize the processing.
Using SKIP LOCK helps you in keeping the code/solution simple and move the burden of identifying the record to process onto the RDBMS.
SKIP LOCK is something that other technologies like Oracle-DB and Postgres already implemented, and their developer communities use.
MySQL implementation comes a bit later, and the option is not widely known or used in the developer’s community using MySQL, but it should.
Give it a try and let us know!
NOTE !!
SKIP LOCK is declared unsafe for statement replication, you MUST use ROW based replication if you use it.
References
MySQL 8.0 Hot Rows with NOWAIT and SKIP LOCKED
MySQL 8.0 Reference Manual: Locking Reads
{jcomments on}
Выполнение работ https://www.kovanie-ogrady.ru/catalog/pamyatniki-muzhchine/granitnyy-pamyatnik-pv-43/
Все мероприятия от выравнивания площадки и благоустройства памятников до изготовления и установки малых архитектурных форм, оградок, выкладывания плитки выполняются на профессиональном уровне https://www.kovanie-ogrady.ru/catalog/byudzhetnye-pamyatniki/pamyatnik-iz-granita-pv-2/
- простота в уборке - уход за могилой станет значительно проще, если уложить плитку https://www.kovanie-ogrady.ru/catalog/vertikalnye/pamyatnik-iz-granita-pv-5/
В очередной раз приходя на кладбище, не придется косить высокую траву https://www.kovanie-ogrady.ru/catalog/pamyatniki-muzhchine/?PAGEN_2=5
Заливка фундамента под памятник https://www.kovanie-ogrady.ru/catalog/byudzhetnye-pamyatniki/pamyatnik-iz-granita-pv-16/
В нашей компании памятники устанавливают на железобетонные балки, на бессерный или ленточный фундамент https://www.kovanie-ogrady.ru/catalog/pamyatniki-docheri/granitnyy-pamyatnik-pr-35/
Выбор зависит от типа установленного памятника https://www.kovanie-ogrady.ru/catalog/pamyatniki/granitnyy-pamyatnik-pv-37/
Украшение декоративным щебнем https://www.kovanie-ogrady.ru/catalog/pamyatniki-babyshke/pamyatnik-iz-granita-pv-8/
Этот материал защищает от сорняков и грязи, устойчив к перепадам температур, поглощает влагу и имеет приемлемую стоимость https://www.kovanie-ogrady.ru/catalog/izdeliya-iz-granita/graverovalnye-raboty-go-2/
Оформление плиткой https://www.kovanie-ogrady.ru/catalog/pamyatniki-siny/granitnyy-pamyatnik-pr-25/
Плитка укладывают на ту территорию участка, которую не планируют использовать под захоронение https://www.kovanie-ogrady.ru/catalog/pamyatniki-siny/granitnyy-pamyatnik-pg-31/
Для этих целей подходит тротуарное, гранитное, керамогранитное покрытие и плитка ГРЕС https://www.kovanie-ogrady.ru/catalog/pamyatniki-detskie/granitnyy-pamyatnik-pv-30/
Благоустройство брусчаткой https://www.kovanie-ogrady.ru/catalog/pamyatniki-siny/granitnyy-pamyatnik-pv-54/
На выбор для клиента всегда в наличии имеется 5 видов брусчатки https://www.kovanie-ogrady.ru/catalog/pamyatniki-siny/granitnyy-pamyatnik-k-13/
Клеверная похожа на листик растения, английский булыжник популярен в темно-сером и коричневом цвете, «кирпичик» привлекает своей устойчивостью к нагрузкам, галтованная брусчатка выделяется закругленными углами, «волна» очень плотно укладывается https://www.kovanie-ogrady.ru/catalog/pamyatniki-muzhchine/granitnyy-pamyatnik-pv-54/
Установка скамейки и стола https://www.kovanie-ogrady.ru/catalog/pamyatniki-muzhchine/granitnyy-pamyatnik-pv-56/
Такие элементы мемориального комплекса позволят передохнуть, что особенно актуально, если кладбище находится далеко https://www.kovanie-ogrady.ru/catalog/gorizontalnye/granitniy-pamyatnik-pg-11/
За столом удобно зажечь свечу, помолиться за упокой души https://www.kovanie-ogrady.ru/catalog/pamyatniki-docheri/granitnyy-pamyatnik-pr-18/
Отправьте заявку сейчас и получите скидку до 50%
Визуальное обозначение границ захоронения решает как функциональные, так и эстетические задачи:
Центральная вставка на спинках под подголовниками, швы с прострочкой по бокам спинок https://интерьер-авто52.рф/product/avtochehly-toyota-auris-chernye-3d-otstrochka-seraya/
Чтобы заказать пошив авточехлов в Новосибирске, свяжитесь с нами по телефону или через форму на сайте https://интерьер-авто52.рф/product-category/avtochehly/page/68/
Наши менеджеры проконсультируют вас по всем вопросам, помогут выбрать подходящие материалы и оформят заказ https://интерьер-авто52.рф/product-category/avtochehly/renault/renault-fluence/renault-fluence-renault-fluence/
Знайте, что мы можем доставить авточехлы в любой город и даем гарантию производителя на наши чехлы https://интерьер-авто52.рф/product/avtochehly-lada-vesta-serye-alkantara-bezhevaya-otstrochka-bezhevaya/
Это означает, что если они вам не подойдут или чехлы будут иметь дефект, мы всегда придем на помощь и решим проблему!
Прочность и долговечность: Авточехлы из экокожи, велюра и рогожки устойчивы к износу и сохраняют свой первоначальный вид даже после длительного использования https://интерьер-авто52.рф/product-category/avtochehly/ford/ford-escape/ford-escape-ii-2007-2012-g-v/
(указана цена за 5-местный салон)
Удобство и комфорт: Наши чехлы на сидения обеспечивают максимальный комфорт водителя и пассажиров благодаря мягкости и эргономичности https://интерьер-авто52.рф/product-category/avtochehly/ssangyong/ssangyong-actyon/
Высококачественные материалы: В нашем ассортименте представлены экокожа, велюр и рогожка — материалы, известные своей прочностью и эстетичностью https://интерьер-авто52.рф/product/avtochehly-mitsubishi-l200-iv-chernye-3d-otstrochka-seraya/
Авточехлы из этих тканей будут радовать вас долгие годы https://интерьер-авто52.рф/product/avtochehly-kia-sportage-4-chernye-alkantara-sinyaya-romb-otstrochka-sinyaya/
Мы учитываем климатические условия и флору региона для оптимального планирования работ https://arbvbg.ru/privacypolicy
Валка деревьев по частям: поэтапный спил https://arbvbg.ru/spil-vysotsk
Задача специалистов команды «Дровосек» ? аккуратно и безопасно оказать услуги по спилу деревьев https://arbvbg.ru/spil-sovetskii
В нашем арсенале есть бензопилы разной мощности, профессиональное снаряжение для арбористики и лебедка до 5 тонн https://arbvbg.ru/spil-svetogorsk
На крайний случай припасена спецтехника в виде автовышки, автокрана https://arbvbg.ru/spil-priozersk
Как видите, мы готовы к любой ситуации https://arbvbg.ru/spil-kamennogorsk
Способ работы с деревьями выбирается согласно условиям работы, количеству деревьев и развитости кроны https://arbvbg.ru/spil-zelenogorsk
Вы верно поняли, не клиент выбирает метод работы, а специалисты https://arbvbg.ru/spil-priozersk
Для выбора оптимальной метода работы, учитываются следующие факторы возраст дерева, прочность древесины, естественный наклон, развитость кроны https://arbvbg.ru/spil-sovetskii
В нашей практике бывали разные случаи, расскажем о каждом способе подробнее https://arbvbg.ru/spil-vysotsk
Спиливание деревьев https://arbvbg.ru/spil-vysotsk
высокий уровень сервиса; гарантию безопасности объектов; приемлемые расценки на оказываемые услуги; использование спецтехники и современного оборудования https://arbvbg.ru/spil-vysotsk
В таких условиях нередко просто пройти нельзя, а тут еще и дерево спилить https://arbvbg.ru/spil-priozersk
Спиливание деревьев на кладбище, очень не простой и тяжелый труд https://arbvbg.ru/spil-sovetskii
Каждый заказ требует применение тяжелых технических приемов https://arbvbg.ru/spil-vysotsk
Но это наша работа и мы готовы помочь https://arbvbg.ru/privacypolicy
Благоустройство могилы https://www.kovanie-ogrady.ru/catalog/pamyatniki-detskie/granitnyy-pamyatnik-k-8/
Наземное покрытие — подсыпка песка, мраморной крошки, укладка искусственного газона, тротуарной плитки, заливка стяжки придает прилегающей к захоронению территории ухоженный вид https://www.kovanie-ogrady.ru/catalog/kovanye-izdeliya/oven/
На наземном покрытии не вырастают сорняки, проще ухаживать за участком https://www.kovanie-ogrady.ru/catalog/pamyatniki-dedyshke/pamyatnik-iz-granita-pv-21/
Установка железобетонного цоколя — конструкция обозначает границы территории погребения https://www.kovanie-ogrady.ru/catalog/pamyatniki-siny/granitnyy-pamyatnik-pv-43/
Он необходим, чтобы внутри залить стяжку, положить плитку https://www.kovanie-ogrady.ru/catalog/pamyatniki-docheri/granitnyy-pamyatnik-pg-23/
Декорирование — размещение на участке каменных ваз, скульптур, лампад, оград, скамеек, столиков https://www.kovanie-ogrady.ru/catalog/pamyatniki-s-arkoj/granitnyy-pamyatnik-pg-23/
Элементы создают особую атмосферу, служат украшением участка https://www.kovanie-ogrady.ru/catalog/izdeliya-iz-granita/granitnyy-pamyatnik-k-5/
Заливка фундамента под памятник https://www.kovanie-ogrady.ru/catalog/pamyatniki-docheri/granitnyy-pamyatnik-pr-7/
В нашей компании памятники устанавливают на железобетонные балки, на бессерный или ленточный фундамент https://www.kovanie-ogrady.ru/catalog/pamyatniki/granitnyy-pamyatnik-pv-23/
Выбор зависит от типа установленного памятника https://www.kovanie-ogrady.ru/catalog/pamyatnik-mame/granitnyy-pamyatnik-pv-62/
Украшение декоративным щебнем https://www.kovanie-ogrady.ru/catalog/pamyatnik-mame/granitnyy-pamyatnik-pv-53/
Этот материал защищает от сорняков и грязи, устойчив к перепадам температур, поглощает влагу и имеет приемлемую стоимость https://www.kovanie-ogrady.ru/catalog/pamyatniki-babyshke/pamyatnik-iz-granita-pv-16/
Оформление плиткой https://www.kovanie-ogrady.ru/catalog/pamyatniki-detskie/granitnyy-pamyatnik-pv-56/
Плитка укладывают на ту территорию участка, которую не планируют использовать под захоронение https://www.kovanie-ogrady.ru/catalog/pamyatniki-detskie/granitnyy-pamyatnik-pg-25/
Для этих целей подходит тротуарное, гранитное, керамогранитное покрытие и плитка ГРЕС https://www.kovanie-ogrady.ru/catalog/pamyatniki-babyshke/granitnyy-pamyatnik-pg-9/
Благоустройство брусчаткой https://www.kovanie-ogrady.ru/catalog/kovanye-izdeliya/kovanaya-ograda-na-mogilu-romb/
На выбор для клиента всегда в наличии имеется 5 видов брусчатки https://www.kovanie-ogrady.ru/catalog/pamyatniki/granitnyy-pamyatnik-pr-8/
Клеверная похожа на листик растения, английский булыжник популярен в темно-сером и коричневом цвете, «кирпичик» привлекает своей устойчивостью к нагрузкам, галтованная брусчатка выделяется закругленными углами, «волна» очень плотно укладывается https://www.kovanie-ogrady.ru/catalog/pamyatniki-dedyshke/pamyatnik-iz-granita-pv-2/
Установка скамейки и стола https://www.kovanie-ogrady.ru/catalog/pamyatniki-dvojnye/granitnyy-pamyatnik-pg-27/
Такие элементы мемориального комплекса позволят передохнуть, что особенно актуально, если кладбище находится далеко https://www.kovanie-ogrady.ru/catalog/pamyatniki-s-arkoj/granitnyy-pamyatnik-pg-30/
За столом удобно зажечь свечу, помолиться за упокой души https://www.kovanie-ogrady.ru/catalog/pamyatnik-mame/granitnyy-pamyatnik-pv-42/
Быстрая доставка на любое кладбище Москвы и МО https://www.kovanie-ogrady.ru/catalog/pamyatniki-zchenshchine/granitnyy-pamyatnik-pv-28/
Благоустройство мест захоронения представляет собой комплекс мероприятий, направленных на создание комфортной, эстетически привлекательной и функционально организованной территории https://www.kovanie-ogrady.ru/catalog/kovanye-izdeliya/volna/
Эти меры не только выражают уважение к памяти усопших, но и способствуют поддержанию порядка и улучшению условий для посетителей https://www.kovanie-ogrady.ru/catalog/izdeliya-iz-granita/granitnyy-pamyatnik-pg-7/
Рассмотрим основные направления и примеры благоустройства кладбищ https://www.kovanie-ogrady.ru/catalog/izdeliya-iz-granita/granitnyy-pamyatnik/
Качественное освещение невозможно без привлечения специалистов https://www.profit-energo.ru/catalog/k-9778246-skladyvayushchiyesya
Установка включает в себя не только монтаж самих опор, но и организацию электроснабжения, проверку всех соединений и тестирование системы https://www.profit-energo.ru/catalog/k-9778246-skladyvayushchiyesya
Это позволит избежать неприятностей в будущем https://www.profit-energo.ru/catalog/k-8141280-metallokonstruktsii_dlya_lep
Основное назначение опор, что понятно из названия, монтаж осветительных приборов https://www.profit-energo.ru/catalog/k-7531311-ramy_metallicheskiye
В зависимости от модификации опоры и типа используемого кронштейна на один ствол можно установить несколько светильников или прожекторов https://www.profit-energo.ru/catalog/k-9778252-raspredelitelnyye_ustroystva
Принимая во внимание все эти факторы, вы сможете выбрать подходящие опоры уличного освещения, что повысит эффективность и долговечность всей системы https://www.profit-energo.ru/catalog
Зачем нужна опора уличного освещения? Это вопрос, который возникает у многих при проектировании уличного освещения https://www.profit-energo.ru/catalog/k-4310050-opory_osveshcheniya
На первый взгляд, кажется, что опора – это просто элемент, который держит светильник https://www.profit-energo.ru/catalog
Однако на самом деле ее роль намного шире и важнее, чем может показаться https://www.profit-energo.ru/catalog/k-9778241-nesilovyye