áá±áá¬áá±á·á áºá áœááºážáá±á¬ááºáááºááᯠááá¯áá±á¬ááºážá¡á±á¬ááºáá¯ááºááá¯á· á áááºáá°á áá¬áááá¯áá²á· áá±á·ááœá± áá¯ááºááœá¬ážáá«ááŒá®á á¡áá»áááºá ááŒáááºááá±áá«áá°ážá áááºážááá¬á áœáá·áºáŠážáá®ááœááºáá°ááá¯ááºážáᬠáá°ááá¯á·áááºááŸááºážáá®ááá¯ááºáá²á· áá±áá¬á¡á¬ážáá¯á¶ážááᯠá á¯áá±á¬ááºážááá¯á· ááŒáá¯ážá á¬ážáááºážáá²á· áá±á¬ááºááẠFacebook ááᯠáááºáá®ážáá»ááºááŒáá«áááºá áá¯ááºáááºážáá»á¬ážááẠááœá±ááŸá¬ááẠáá°áá®áá±ážáá±á¬ ááá¯ááá¯áá±á¬ááºážááœááºáá±á¬ áá±á¬áºáááºáá»á¬ážááᯠáá±á·áá»áá·áºááẠá€áá±áá¬ááᯠááá¯á¡ááºáá«áááºá ááá¯ááá¯á·áá±á¬á¡ááŒá±á¡áá±áá»á¬ážááœááºá áááá¯ááááºáá¬áá»á¬ážááẠá¡áá»ááºá¡áááºá¡áá»á¬ážá¡ááŒá¬ážááŒáá·áº áá»ááºááŒááºá áœá¬ áá¯á¶ááŒááºá áááºáá»á áœá¬ á¡áá¯ááºáá¯ááºááá¯ááºá á±ááá·áº API áá»á¬ážááᯠáááºáá®ážáááºááá¯á¡ááºáááºá
á¡áááºá áááºááẠá¡ááá®áá±ážááŸááºáž ááá¯á·ááá¯áẠáá±áá¬áá±á·á
áºáá±á¬ááºááœááºááœáẠá¡áá»áááºá¡ááá¯ááºážá¡áá¬áá
áºáá¯á¡áá áá®ááá¯ááºážááœá²áá±áá«áá paginated queries ááᯠrun ááẠáá¯ááºááᯠáááºáá±ážáá¬ážááŒá®ážááŒá
áºááá¯ááºáááºá á¥ááá¬á á€áá²á·ááá¯á·áá±á¬á
SELECT * FROM table_name LIMIT 10 OFFSET 40
áááºááá¯áá¯á¶á á¶áá²?
áá«áá±ááá·áº áááºážáá²á· pagination áá¯ááºáá¯á¶á áá®ááá¯ááá¯áááºá á¡áááá±á¬ááºáá¯á¶ážáááºážáááºážáá²á· ááá¯ááºáá²á·áá°ážááá¯á· áá±á¬ááºážáááºáá«áááºá
áááºážá áá«á·ááᯠááá·áºááœááºáá»ááºáá¬ážá
á¡áá¯á¶ážáááŒá¯áá°ážáá±á¬ áá±á¬ááºáá¶áá±á¬á·ááºáá²áá±ážáá¬ážáá° á¡áááºážáá¯á¶ážáá
áºáŠážááᯠá¡áááºáá±ážáá«á OFFSET
О LIMIT
paginated áá±ážááœááºážáá»á¬ážááá¯áá¯ááºáá±á¬ááºáááºá MVP (Minimum Viable Product) ááŸáá·áº áá±áá¬á¡áááºážáááºááᯠá¡áá¯á¶ážááŒá¯ááá·áº ááá±á¬áá»ááºáá»á¬ážááœááºá á€áá»ááºážáááºááŸá¯ááẠá¡áá±á¬áºáá±áž áááºááá¯ááºáá«áááºá âá¡áá¯ááºááŒá
áºáááºâ ááá¯á· ááŒá±á¬ááá¯á·ááááºá
áá«áá±ááá·áº áá¯á¶ááŒááºá áááºáá»áááŒá®áž áááá±á¬ááºáá²á·á áá áºááœá±ááᯠá¡á ááá±ááŒááºáááºáá®ážááá¯á· ááá¯á¡ááºáááºááá¯áááºá áá®ááá¯á áá áºááœá±ááŸá¬áá¯á¶ážáá²á· databases ááœá±ááᯠáá±ážááŒááºážááŒááºážáá²á· áááá±á¬ááºááŸá¯ááᯠááŒáá¯áááºááá¯á áá¯ááºááá·áºáá«áááºá
ááá±á·áá»áœááºá¯ááºááá¯á·ááẠpaginated query engines áá»á¬ážá á¡áá¯á¶ážáá»á¬ážáá±á¬ (ááá¯ážááœááºážáááº) ááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºááŒááºážááá¯ááºáᬠááŒá¿áá¬áá»á¬ážááŸáá·áº ááá¯áá±ážááœááºážáá»á¬ážááᯠáá¯ááºáá±á¬ááºááá·áºá¡áá« ááŒáá·áºáá¬ážáá±á¬á áœááºážáá±á¬ááºáááºááᯠáááºááá¯á·áááŸáá á±áááºááᯠááœá±ážááœá±ážáá«áááºá
OFFSET ááŸáá·áº LIMIT ááœáẠáá¬ááŒá¿áá¬ááŸáááááºážá
ááŒá±á¬ááŒá®ážáá¬ážá¡ááá¯ááºážá OFFSET
О LIMIT
áááºážááá¯á·ááẠáá±áá¬ááá¬ááá»á¬ážá
áœá¬ááŒáá·áº áá¯ááºáá±á¬ááºáááºáááá¯á¡ááºáá±á¬ ááá±á¬áá»ááºáá»á¬ážááœáẠáá±á¬ááºážá
áœá¬áá¯ááºáá±á¬ááºááá¯ááºáááºá
áá±áá¬áá±á·á áºááẠáá¬áá¬áááŸááºáá¬ááºááœáẠá¡á¶ááááºáá±á¬á·ááá·áº á¡ááœááºá¡á á¬ážá¡áá ááŒá®ážááœá¬ážáá¬áá±á¬á¡áá« ááŒá¿áá¬ááŒá áºáá¬áááºá ááá¯á·áá±á¬áºá á€áá±áá¬áá±á·á áºááŸáá·áºá¡áá¯ááºáá¯ááºáá±á¬á¡áá«á áááºááẠpaginated queries ááá¯á¡áá¯á¶ážááŒá¯áááºááá¯á¡ááºáááºá
á€ááŒá¿áá¬ááᯠáááºááŸá¬ážá á±áááºá¡ááœááºá DBMS ááẠpaginated query áá áºáá¯á á®ááœáẠáááá±á¬ááºááŸá¯áááŸááá±á¬ Full Table Scan áá¯ááºáá±á¬ááºáá»ááºááᯠáá¯ááºáá±á¬ááºáá±ážááá·áº á¡ááŒá±á¡áá±áá áºáá¯ááŸááááẠ(ááá·áºááœááºážááŒááºážááŸáá·áº áá»ááºááŒááºážáá¯ááºáá±á¬ááºááŸá¯áá»á¬áž ááŒá áºáá±á«áºááá¯ááºááŒá®ážá áá»áœááºá¯ááºááá¯á·ááẠáá±ááºááá®áá±á¬áá±áᬠáááá¯á¡ááºáá«á)á
"á á¬ážááœá²á¡ááŒáá·áºá áááºááº" (ááá¯á·ááá¯áẠ"ááá¬ážáááºááá¯ááºá áááºááº"á áááºááá¯ááºá áááºááºááá¯áá¬áá¬áá²á áááºážááẠDBMS ááẠááá¬ážáá¡áááºážáá áºáá¯á á®ááᯠá ááºáááºáááŒááºáááºáááºá ááá¯ááá¯áááºááŸá¬ áááºážááœááºáá«ááŸááá±á¬áá±áá¬áá»á¬ážááᯠáá±ážáá¬ážááá·áºá¡ááŒá±á¡áá±áá áºáá¯ááŸáá·áº ááá¯ááºáá»á±á¬áá®ááœá±ááŸááááŸá á á áºáá±ážáá±ážááá·áº áá¯ááºáá±á¬ááºáá»ááºáá áºáá¯ááŒá áºáááºá á€ááá¬ážááᯠá áááºáááºááŒááºáž á¡áá»áá¯ážá¡á á¬ážááẠá¡ááŸá±ážáá¯á¶ážáᯠáá°áááá»á¬ážáááºá á¡ááŸááºááŸá¬ áááºážááᯠáá¯ááºáá±á¬ááºáá±á¬á¡áá«ááœáẠáá¬áá¬ááá áºááœá²á áá áºáá«áááºááá·áº á¡áááº/á¡ááœáẠáá¯ááºáá±á¬ááºáá»ááºáá»á¬ážá áœá¬ááᯠáá¯ááºáá±á¬ááºáááºá disks áá»á¬ážáá±á«áºááœááºááááºážáááºážáá¬ážáá±á¬áá±áá¬áá»á¬ážááŸáá·áºá¡áá¯ááºáá¯ááºááŒááºážááŸáá·áºáááºá ááºáá±áá±á¬ latency ááŒá±á¬áá·áºá¡ááŒá±á¡áá±áááºááá¯ááá¯ááá¯ážááœá¬ážáá¬ááŒá®áž disk á០memory ááá¯á· data áá»á¬ážááá¯ááœáŸá²ááŒá±á¬ááºážááŒááºážáááºá¡áááºážá¡ááŒá áº-á¡ááœááºá¡áá»áœá¶áá¯ááºáá±á¬ááºááŸá¯áá áºáá¯ááŒá áºáááºá
á¥ááá¬á¡á¬ážááŒáá·áºá ááá·áºááœáẠá¡áá¯á¶ážááŒá¯áá° 100000000 á ááŸááºáááºážáá»á¬áž ááŸáááŒá®áž áááºáá±á¬ááºáá¯á¶ááŸáá·áº áá±ážááŒááºážáá»ááºáá
áºáá¯ááᯠáááºáá¯ááºáá±á¬ááºááẠOFFSET 50000000
. ááá¯ááá¯áááºááŸá¬ DBMS ááẠá€ááŸááºáááºážáá»á¬ážá¡á¬ážáá¯á¶ážááᯠáááºááá«ááẠ(áááºážááá¯á·ááᯠáá»áœááºá¯ááºááá¯á·ááẠáááá¯á¡ááºáá«!)á áááºážááá¯á·ááᯠááŸááºáá¬ááºáá²ááœáẠááá·áºáá¬ážááŒá®ážáá±á¬ááºááœáẠá¡á
á®áááºáá¶áá¬ážáá±á¬ áááẠ20 ááᯠáá°áá«áᯠááá¯áá«áááºá LIMIT
.
áááºážááẠá€áá²á·ááá¯á·áá±á¬áá¯á¶áá±á«ááºáááºáᯠááá¯ááŒáá«á áá¯á·- "50000 á០50020 á០100000 á¡áááºážáá»á¬ážááᯠááœá±ážáá«"á ááá¯ááá¯áááºááŸá¬á á áá áºááẠquery ááᯠá¡ááŒá®ážáááºááẠá¡áááºáž 50000 ááᯠááááá¯á¶áž áááºááẠááá¯á¡ááºáá«áááºá áááá¯á¡ááºáá²á· á¡áá¯ááºááœá± áááºáá±á¬ááºáá¯ááºááááºááá¯áᬠáááºážááŒááºáá¬ážá
ááá¯á¶ááẠáá»áœááºáá±á¬áº áááºáá®ážáá¬ážáá²á· á¡ááºá¹áá«áááºááœá±ááᯠááŒáá·áºáá«á
db-fiddle.com ááœáẠá¥ááá¬
ááá¯ááŸá¬á áááºáááºá áááºááœááºážáá²ááŸá¬ Schema SQL
áá±áá¬áá±á·á
áºáá²ááá¯á· á¡áááºážáá±á«ááºáž 100000 ááá·áºáá±á¬ áá¯áẠááŸáááŒá®áž áá¬áááºááœáẠá¡ááœááºá Query SQL
áá±ážááœááºážááŸá
áºáá¯ááᯠááŒáá¬ážáááºá áááá ááŸá±ážááœá±ážáá±á¬á á€áá¯á¶áááº-
SELECT *
FROM `docs`
LIMIT 10 OFFSET 85000;
áá°áá®áá±á¬ááŒá¿áá¬á¡ááœáẠáááá±á¬ááºáá±á¬ááŒá±ááŸááºážáá»ááºááŒá áºááá·áº áá¯áááá¡áá»ááºááŸá¬ á€áá²á·ááá¯á·ááŒá áºáááºá
SELECT *
FROM `docs`
WHERE id > 85000
LIMIT 10;
á€áá±á¬ááºážááá¯ááŸá¯áá»á¬ážááᯠááŒáá·áºáááºážáááºá¡ááœáẠááá¯ááºááá¯ááŸáááºáá¯á¶áá¬ááŒá
áºáááºá Run
á
á¬áá»ááºááŸá¬áááááºááœááºá áááºážááá¯áá¯ááºáá±á¬ááºááŒá®ážáá±á¬ááºá áá»áœááºá¯ááºááá¯á·ááẠáá±ážááŒááºážááŸá¯áá¯ááºáá±á¬ááºáá»áááºááŸáá·áºáááºáááºááá·áº á¡áá»ááºá¡áááºáá»á¬ážááᯠááŸáá¯ááºážááŸááºáá«áááºá áááá±á¬ááºááŸá¯áááŸááá±á¬ query áá
áºáá¯ááᯠáá¯ááºáá±á¬ááºááŒááºážááẠáá¯ááááá
áºáá¯ááᯠáá¯ááºáá±á¬ááºááŒááºážááẠá¡áááºážáá¯á¶áž á¡á 30 ááá¯ááŒá¬ááẠ(á€á¡áá»áááºááẠrun áá
áºáá¯ááŸáá·áºáá
áºáᯠrun ááŸá¯ááœá²ááŒá¬ážáááºá á¥ááá¬á¡á¬ážááŒáá·áºá ááá query ááẠ37 ms ááŒá¬ááŒáá·áºáááºáᯠsystem á០áááºááŒááá¯ááºáá±á¬áºáááºážá áá¯ááá - 1 ms) á
áá±áá¬ááœá± ááá¯ááŸááá±ááẠá¡áá¬á¡á¬ážáá¯á¶ážá ááá¯áá±á¬ááºááá¯ážáá¬áááá·áºááẠ(áá«ááᯠáá¯á¶áá»ááºááẠáá«á·ááŸá¬ ááŒáá·áºáá«á
áá»áœááºá¯ááºááá¯á· ááá¯áá±ážááẠááœá±ážááœá±ážáá²á·ááá·áºá¡áá¬ááẠááá·áºá¡á¬áž áá±áá¬áá±á·á áºáá±ážááœááºážáá»á¬ážááᯠáááºááá¯á·áá¯ááºáá±á¬ááºááŒá±á¬ááºážááᯠááá¯ážááœááºážááááŒááºá á±ááá·áºáááºá
áááºááá¯ážááŒáá·áºáá± áááááŒá¯áá«á OFFSET
- áá±á¬ááºážááá¯ááŸá¯ááŒá®ážááŒá±á¬ááºááẠá¡áá»áááºááá¯ááŒá¬áááá·áºáááºá
OFFSET ááŸáá·áº LIMIT áá±á«ááºážá ááºáá¬á á¡áááºá¡áá¬ááᯠá¡áá¯á¶ážááŒá¯ááááºáááºážá
áá±á«ááºážá
ááºá¡á
á¬áž OFFSET
О LIMIT
á¡á±á¬ááºáá±á¬áºááŒáá«á¡á
á®á¡á
á¥áºá¡ááá¯ááºáž áááºáá±á¬ááºáá¬ážáá±á¬ á¡áá±á¬ááºá¡áŠááᯠá¡áá¯á¶ážááŒá¯áááá»áá¯ážáááºáá«áááºá
SELECT * FROM table_name WHERE id > 10 LIMIT 20
áááºážááẠcursor á¡ááŒá±áᶠpagination ááŒáá·áº query execute ááŒá áºáááºá
ááŒááºááœááºážááŸá¬ áááºááŸáááááºážáááºážááá·áºá¡á
á¬áž OFFSET
О LIMIT
áá±á¬ááºážááá¯áá»ááºáá
áºáá¯á
á®ááŒáá·áº áááºážááá¯á·ááᯠáá±ážááá¯á·áá«á áá±á¬ááºáá¯á¶ážáááŸááá¬ážáá±á¬ á¡ááááá±á¬á·ááᯠááááºážáááºážáá¬ážááẠááá¯á¡ááºááẠ(áá»á¬ážáá±á¬á¡á¬ážááŒáá·áº áááºážááẠá€á¡áá¬ááŒá
áºáááºá ID
) ááŸááºá· LIMIT
ááá¯á·ááŒá±á¬áá·áºá á¡áááºáá±á¬áºááŒáá«áá±ážááœááºážáá»á¬ážááŸáá·áº á¡áá¬ážáá°áá±ážááœááºážáá»á¬ážááᯠáááŸááááºááŒá
áºáá«áááºá
á¡áááºááŒá±á¬ááºá·? á¡áááá¡áá»ááºááŸá¬ áááºááŒá®ážááá·áºáá±á¬ááºáá¯á¶ážá¡áááºážá identifier ááᯠá¡ááá¡áááºážáááºááŸááºááŒááºážááŒáá·áº ááá¯á¡ááºááá·áºáá±áá¬ááᯠá áááºááŸá¬ááœá±ááẠááá¯á¡ááºááá·áºáá±áá¬ááᯠáááºá DBMS á¡á¬áž ááŒá±á¬ááŒááŒááºážááŒá áºáááºá ááá¯á·á¡ááŒááºá áá±á¬á·á¡áá¯á¶ážááŒá¯ááŸá¯ááŒá±á¬áá·áº ááŸá¬ááœá±ááŸá¯ááᯠáááááá±á¬ááºáá±á¬áẠáá¯ááºáá±á¬ááºááá¯ááºáááºááŒá áºááŒá®ážá á áá áºááẠáááºááŸááºáá¬ážááá·áº á¡ááá¯ááºážá¡ááŒá¬ážááŒááºáááœáẠááá¯ááºážáá»á¬ážááŒáá·áº á¡á¬áá¯á¶ááœá±ááŒá¬ážáá±á áᬠáááá¯áá±á
á¡áá»áá¯ážáá»áá¯ážáá±á¬áá±ážááœááºážáá»á¬ážáá¡á±á¬ááºáá«á áœááºážáá±á¬ááºáááºááŸáá¯ááºážááŸááºáá»ááºááá¯ááŒáá·áºááŸá¯ááŒáá«á áá¯á·á áá«ááá±á¬á· áááá±á¬ááºááŸá¯áááŸááá²á· áá±ážááœááºážáá áºáá¯áá«á
áá±á¬ááºážááá¯ááŸá¯ááŸá±ážááœá±áž
á€ááœáẠá€áá±á¬ááºážááá¯áá»ááºá á¡áá±á¬ááºážáá¯á¶ážáá¬ážááŸááºážáá áºáá¯ááŒá áºáááºá
á¡ááŒááºáá±á¬ááºážááá¯áá«á
áá±ážááœááºážááŸá áºáá¯áá¯á¶ážááẠá¡ááá¡áá»áá°áá®áá±á¬áá±áá¬ááá¬áááᯠááŒááºáá±ážáááºá áá«áá±ááá·áº ááááá áºáá¯á ááŒá®ážááá¯á· 12,80 á áá¹ááá·áºáá²á· áá¯ááááá áºáá¯á 0,01 á áá¹ááá·áº ááŒá¬áá«áááºá ááœá¬ááŒá¬ážááŸá¯ááᯠáááºáá¶á á¬ážááá«ááá¬ážá
á¡áá¬ážá¡áá¬ááŸááá±á¬ááŒá¿áá¬áá»á¬áž
á¡ááá¯ááŒá¯áá¬ážáá±á¬ áá±ážááŒááºážááŸá¯áááºážáááºážááᯠáááá±á¬ááºá áœá¬áá¯ááºáá±á¬ááºáááºá¡ááœááºá ááá¬ážááœáẠááááºážááŒáá·áºáááºááŸááºááŸá¯áá²á·ááá¯á·áá±á¬ áá°ážááŒá¬ážáá±á¬á áááºááá¯ááºá¡ááœáŸááºážááááºážáá»á¬ážáá«ááŸááá±á¬ áá±á¬áºáᶠ(ááá¯á·ááá¯ááº) áá±á¬áºáá¶áá»á¬áž ááŸáááá«áááºá á¡áá»áá¯á·áá±á¬ááá á¹á áááºáá»á¬ážááœááºá áááºážááẠáá±áá¬áá±á·á áºááŸáá·áºá¡áá¯ááºáá¯ááºááŒááºážáá¡ááŸáááºááᯠááá¯ážááŒáŸáá·áºáááºá¡ááœáẠááá¯ááá¯á·áá±á¬áá±ážááœááºážáá»á¬ážááá¯á¡áá¯á¶ážááŒá¯ááŒááºážáá¡á±á¬ááºááŒááºááŸá¯ááᯠáá¯á¶ážááŒááºááá¯ááºáááºá
áá¯á¶ážá
á¶á¡ááá¯ááºážá á
á¯á¶á
ááºážáá±ážááŒááºážááŸá¯áá»á¬ážááᯠáááºáá±á¬ááºááá·áºá¡áá«á áááºááẠááá¬ážáá»á¬ážá áááá»áá±á¬ áááºáá±á¬ááºááŸá¯áá¯á¶á
á¶ááᯠááá·áºááœááºážá
ááºážá
á¬ážááẠááá¯á¡ááºááŒá®áž áááºááŸá ááá¬ážáá»á¬ážááœáẠá¡áá±á¬ááºážáá¯á¶áž áá¯ááºáá±á¬ááºááá·áº á¡ááá¯áá« ááá¹ááá¬ážáá»á¬ážááᯠááœá±ážáá»ááºáá«á á¥ááá¬á¡á¬ážááŒáá·áºá áááºá
ááºáá±áá¬á¡ááŒá±á¬ááºá¡ááŒá¬ážááŒáá·áº á
á¯á¶á
ááºážáá±ážááŒááºážááŸá¯áá»á¬ážááœáẠáá¯ááºáá±á¬ááºááẠááá¯á¡ááºáá«áá áááºážááᯠá
áááºáááºá
á¬ážááœáẠááœá±á·ááŸáááá¯ááºáááºá
á¡áááºá áá»áœááºá¯ááºááá¯á·ááẠáááºááá±á¬á·ááᯠáá»á±á¬ááºáá¯á¶ážááœá¬ážááá·áº ááŒá¿áá¬ááŸáá·áº ááŒá¯á¶ááœá±á·ááá«áá á¥ááá¬á¡á¬ážááŒáá·áºá áá»áœááºá¯ááºááá¯á·ááœáẠáá»á¬ážá
áœá¬áá±á¬ áááºá
ááºááŸá¯ááŸááá±á¬ ááá¬ážáá
áºáá¯ááŸááá»áŸááºá á¡áá¯á¶ážááŒá¯ááŒááºážá ááá¯ážáá¬áááºážáááºážá OFFSET
О LIMIT
áá»áœááºá¯ááºááá¯á·ááŸáá·áºááá¯ááºáá®áááºá¡á¬ááá¶áá«áááºá ááá¯á·áá±á¬áº áááºážáá¡áá¯á¶ážááŒá¯ááŸá¯ááẠááŸá±ážááœá±ážááá¯ááºáá»á±ááŸááá±á¬ áá±ážááœááºážáá»á¬ážááᯠááŒá
áºáá±á«áºá
á±ááá¯ááºáááºá ááá¯ááá¯á·áá±á¬á¡ááŒá±á¡áá±áá»áá¯ážááœááºá paginated queries áá»á¬ážááá¯ááá¯ááºááœááºáááºáá¬ááá¯á¡ááºáá±á¬áºáááºážá auto-incrementing main key ááá¯á¡áá¯á¶ážááŒá¯áááºá¡ááŒá¶ááŒá¯ááá¯áá«áááºá
áá®á¡ááŒá±á¬ááºážá¡áá¬ááᯠá
áááºáááºá
á¬ážáááºááá¯áááº-
ááááºáá»á¬ážááá¯
áá»áœááºá¯ááºááá¯á·áá±ážááœá²ááá¯ááºááá·áº á¡ááááááá¯á¶ážááŸá¬ áá»áœááºá¯ááºááá¯á·ááŒá±á¬áá±ááá·áºáá±áá¬áá±á·á áºáá»á¬ážáá¡ááœááºá¡á á¬ážáááºáá»áŸáááºááŸááá«á á±á query execution áá¡ááŒááºááŸá¯ááºážááᯠá¡ááŒá²áááºážááœá²ááŒááºážá áááºááŒá¬ááẠááá¯á¡ááºáá«áááºá ááá±á·áá±ááºááœááºá ááŒá±ááŸááºážáá»ááºáá»á¬ážá áá»á²á·ááœááºááá¯ááºááŸá¯ááẠá¡ááœááºá¡áá±ážááŒá®ážááŒá®áž á¡áá»áá¯á·áá±á¬á áá áºáá áºáá¯ááœáẠá¡á ááááºážá á¡áá¬á¡á¬ážáá¯á¶ážááᯠááŸááºáááºá áœá¬ áá®ááá¯ááºážáá¯ááºáá¬ážáá«áá áááºážááẠá¡áá¬áááºááœáẠdeveloper ááᯠááŒá¿áá¬áá»á¬ážá áœá¬á០áááºáááºááá¯ááºáááºááŒá áºáááºá
áá±áá¬áá±á·á áºáá±ážááœááºážáá»á¬ážááᯠáááºáááºáá²á·ááá¯á·ááœá²ááŒááºážá áááºááŒá¬ááŒá®áž ááá¯ááá¯áá±á¬ááºážááœááºá¡á±á¬ááºáá¯ááºáá±á¬ááºááááºážá
source: www.habr.com