PostgreSQL ရှိ အညွှန်းများ၏ အင်္ဂါရပ်အားလုံးကို အသုံးပြုခြင်း။

PostgreSQL ရှိ အညွှန်းများ၏ အင်္ဂါရပ်အားလုံးကို အသုံးပြုခြင်း။
Postgres ကမ္ဘာတွင်၊ ဒေတာဘေ့စ်သိုလှောင်မှု၏ ထိရောက်သောလမ်းကြောင်းပြမှုအတွက် အညွှန်းကိန်းများသည် မရှိမဖြစ်လိုအပ်သည် ("heap" ဟုခေါ်သည်)။ Postgres သည် ၎င်းအတွက် အစုလိုက်အပြုံလိုက်ပြုလုပ်ခြင်းကို မပံ့ပိုးပါ၊ နှင့် MVCC ဗိသုကာသည် သင့်အား တူညီသော tuple ဗားရှင်းများစွာဖြင့် အဆုံးသတ်စေသည်။ ထို့ကြောင့်၊ အသုံးချပရိုဂရမ်များကို ပံ့ပိုးရန်အတွက် ထိရောက်သော အညွှန်းကိန်းများကို ဖန်တီးထိန်းသိမ်းနိုင်ရန် အလွန်အရေးကြီးပါသည်။

ဤသည်မှာ အညွှန်းကိန်းများအသုံးပြုမှုကို အကောင်းဆုံးဖြစ်အောင် မြှင့်တင်ရန် အကြံပြုချက်အချို့ဖြစ်သည်။

မှတ်ချက်- အောက်တွင်ဖော်ပြထားသော မေးမြန်းချက်များသည် မွမ်းမံထားသော အရာတစ်ခုတွင် အလုပ်လုပ်ပါသည်။ pagila နမူနာဒေတာဘေ့စ်.

Covering Index များကို အသုံးပြုခြင်း။

မလှုပ်မရှားအသုံးပြုသူများအတွက် အီးမေးလ်လိပ်စာများကို ထုတ်ယူရန် တောင်းဆိုချက်ကို ကြည့်ကြပါစို့။ စားပွဲ customer ကော်လံတစ်ခုရှိသည်။ active၊ မေးမြန်းချက်သည် ရိုးရှင်းသည်-

pagila=# EXPLAIN SELECT email FROM customer WHERE active=0;
                        QUERY PLAN
-----------------------------------------------------------
 Seq Scan on customer  (cost=0.00..16.49 rows=15 width=32)
   Filter: (active = 0)
(2 rows)

မေးခွန်းသည် ဇယားအပြည့်အစုံကို စကင်ဖတ်စစ်ဆေးခြင်း အစီအစဉ်ကို ခေါ်ဆိုသည်။ customer. ကော်လံတစ်ခုပေါ်တွင် အညွှန်းတစ်ခု ဖန်တီးကြပါစို့ active:

pagila=# CREATE INDEX idx_cust1 ON customer(active);
CREATE INDEX
pagila=# EXPLAIN SELECT email FROM customer WHERE active=0;
                                 QUERY PLAN
-----------------------------------------------------------------------------
 Index Scan using idx_cust1 on customer  (cost=0.28..12.29 rows=15 width=32)
   Index Cond: (active = 0)
(2 rows)

၎င်းသည် ကူညီပေးသည်၊ နောက်ဆက်တွဲစကင်န်သည် "index scan” . ဆိုလိုသည်မှာ Postgres သည် အညွှန်းကို စကင်န်ဖတ်မည်၊idx_cust1"၊ ထို့နောက် အခြားကော်လံများ၏ တန်ဖိုးများကို ဖတ်ရန် ဇယားအမှိုက်ပုံအား ဆက်လက်ရှာဖွေပါ (ဤကိစ္စတွင်၊ ကော်လံ၊ email၎) မေးမြန်းမှု လိုအပ်ပါသည်။

အကျုံးဝင်သော အညွှန်းများကို PostgreSQL 11 တွင် မိတ်ဆက်ထားသည်။ ၎င်းတို့သည် သင့်အား အညွှန်းကိန်းတွင် တစ်ခု သို့မဟုတ် တစ်ခုထက်ပိုသော နောက်ထပ်ကော်လံများပါ၀င်ခွင့်ပြုသည် - ၎င်းတို့၏တန်ဖိုးများကို အညွှန်းဒေတာစတိုးတွင် သိမ်းဆည်းထားသည်။

ကျွန်ုပ်တို့သည် ဤအင်္ဂါရပ်ကို အခွင့်ကောင်းယူကာ အညွှန်းအတွင်း အီးမေးလ်တန်ဖိုးကို ပေါင်းထည့်ပါက၊ ထို့နောက် Postgres သည် တန်ဖိုးအတွက် ဇယားကွက်ကို ရှာဖွေရန် မလိုအပ်ပါ။ email. ဒါက အလုပ်ဖြစ်မဖြစ် ကြည့်ရအောင်။

pagila=# CREATE INDEX idx_cust2 ON customer(active) INCLUDE (email);
CREATE INDEX
pagila=# EXPLAIN SELECT email FROM customer WHERE active=0;
                                    QUERY PLAN
----------------------------------------------------------------------------------
 Index Only Scan using idx_cust2 on customer  (cost=0.28..12.29 rows=15 width=32)
   Index Cond: (active = 0)
(2 rows)

«Index Only Scan' ယခုမေးမြန်းချက်သည် ဇယားပုံအားဖတ်ရန် disk I/O အားလုံးကို ရှောင်ရှားရန် ကူညီပေးသည့် အညွှန်းတစ်ခုသာ လိုအပ်ကြောင်း ကျွန်ုပ်တို့အား ပြောပြသည်။

အကျုံးဝင်သော အညွှန်းကိန်းများသည် B-trees အတွက်သာ လောလောဆယ် ရနိုင်ပါသည်။ သို့သော်လည်း ဤကိစ္စတွင်၊ ပြုပြင်ထိန်းသိမ်းမှု အားထုတ်မှုသည် ပိုမိုမြင့်မားလာမည်ဖြစ်သည်။

Partial Index များကို အသုံးပြုခြင်း။

တစ်စိတ်တစ်ပိုင်း အညွှန်းကိန်းများသည် ဇယားတစ်ခုရှိ အတန်းများ၏ အစုခွဲတစ်ခုသာဖြစ်သည်။ ၎င်းသည် အညွှန်းကိန်းများ၏ အရွယ်အစားကို သက်သာစေပြီး စကင်ဖတ်မှုများကို ပိုမိုမြန်ဆန်စေသည်။

ကယ်လီဖိုးနီးယားရှိ ကျွန်ုပ်တို့၏ဖောက်သည်များ၏ အီးမေးလ်လိပ်စာများစာရင်းကို ရယူလိုသည်ဟု ဆိုကြပါစို့။ တောင်းဆိုချက်သည် ဤကဲ့သို့ဖြစ်လိမ့်မည်-

SELECT c.email FROM customer c
JOIN address a ON c.address_id = a.address_id
WHERE a.district = 'California';
which has a query plan that involves scanning both the tables that are joined:
pagila=# EXPLAIN SELECT c.email FROM customer c
pagila-# JOIN address a ON c.address_id = a.address_id
pagila-# WHERE a.district = 'California';
                              QUERY PLAN
----------------------------------------------------------------------
 Hash Join  (cost=15.65..32.22 rows=9 width=32)
   Hash Cond: (c.address_id = a.address_id)
   ->  Seq Scan on customer c  (cost=0.00..14.99 rows=599 width=34)
   ->  Hash  (cost=15.54..15.54 rows=9 width=4)
         ->  Seq Scan on address a  (cost=0.00..15.54 rows=9 width=4)
               Filter: (district = 'California'::text)
(6 rows)

သာမာန်အညွှန်းကိန်းများသည် ကျွန်ုပ်တို့အား မည်သည့်အရာများ ပေးမည်နည်း။

pagila=# CREATE INDEX idx_address1 ON address(district);
CREATE INDEX
pagila=# EXPLAIN SELECT c.email FROM customer c
pagila-# JOIN address a ON c.address_id = a.address_id
pagila-# WHERE a.district = 'California';
                                      QUERY PLAN
---------------------------------------------------------------------------------------
 Hash Join  (cost=12.98..29.55 rows=9 width=32)
   Hash Cond: (c.address_id = a.address_id)
   ->  Seq Scan on customer c  (cost=0.00..14.99 rows=599 width=34)
   ->  Hash  (cost=12.87..12.87 rows=9 width=4)
         ->  Bitmap Heap Scan on address a  (cost=4.34..12.87 rows=9 width=4)
               Recheck Cond: (district = 'California'::text)
               ->  Bitmap Index Scan on idx_address1  (cost=0.00..4.34 rows=9 width=0)
                     Index Cond: (district = 'California'::text)
(8 rows)

စကင် address အညွှန်းစကင်န်ဖြင့် အစားထိုးထားသည်။ idx_address1ထို့နောက် အမှိုက်ပုံကို စကင်န်ဖတ်သည်။ address.

၎င်းသည် မကြာခဏမေးမြန်းမှုဖြစ်ပြီး အကောင်းဆုံးဖြစ်အောင်ပြုလုပ်ရန် လိုအပ်သောကြောင့်၊ ခရိုင်အတွင်းရှိလိပ်စာများပါရှိသည့် အတန်းများကိုသာ အညွှန်းကိန်းပေးသည့် တစ်စိတ်တစ်ပိုင်းအညွှန်းကို ကျွန်ုပ်တို့အသုံးပြုနိုင်ပါသည်။ ‘California’:

pagila=# CREATE INDEX idx_address2 ON address(address_id) WHERE district='California';
CREATE INDEX
pagila=# EXPLAIN SELECT c.email FROM customer c
pagila-# JOIN address a ON c.address_id = a.address_id
pagila-# WHERE a.district = 'California';
                                           QUERY PLAN
------------------------------------------------------------------------------------------------
 Hash Join  (cost=12.38..28.96 rows=9 width=32)
   Hash Cond: (c.address_id = a.address_id)
   ->  Seq Scan on customer c  (cost=0.00..14.99 rows=599 width=34)
   ->  Hash  (cost=12.27..12.27 rows=9 width=4)
         ->  Index Only Scan using idx_address2 on address a  (cost=0.14..12.27 rows=9 width=4)
(5 rows)

ခုတော့ မေးခွန်းက ဖတ်ရုံပဲ။ idx_address2 စားပွဲကိုမထိဘူး။ address.

Multi-Value Index များကို အသုံးပြုခြင်း။

အညွှန်းပြုရမည့် ကော်လံအချို့တွင် စကလာဒေတာအမျိုးအစား မပါဝင်ပါ။ ကော်လံ အမျိုးအစားများ jsonb, arrays и tsvector ပေါင်းစပ် သို့မဟုတ် တန်ဖိုးများစွာ ပါဝင်သည်။ ထိုသို့သောကော်လံများကို အညွှန်းရေးရန် လိုအပ်ပါက၊ ထိုကော်လံများတွင် တစ်ဦးချင်းတန်ဖိုးများအားလုံးကို ရှာဖွေရတတ်သည်။

မအောင်မြင်သော အချိန်များကို ဖြတ်တောက်ထားသော ရုပ်ရှင်အားလုံး၏ ခေါင်းစဉ်များကို ရှာကြည့်ကြပါစို့။ စားပွဲ film စာသားကော်လံဟုခေါ်သည်။ special_features. ရုပ်ရှင်တွင် ဤ "အထူးပိုင်ဆိုင်မှု" ရှိပါက၊ ကော်လံတွင် စာသားအခင်းအကျင်းတစ်ခုအနေဖြင့် အစိတ်အပိုင်းပါရှိသည်။ Behind The Scenes. ထိုကဲ့သို့သောဇာတ်ကားများအားလုံးကို ရှာဖွေရန် "Behind The Scenes" နှင့် အတန်းအားလုံးကို ရွေးချယ်ရန် လိုအပ်ပါသည်။ မည်သည့် array တန်ဖိုးများ special_features:

SELECT title FROM film WHERE special_features @> '{"Behind The Scenes"}';

သိုက်အော် @> ညာဘက်ခြမ်းသည် ဘယ်ဘက်ခြမ်း၏ အခွဲတစ်ခု ဟုတ်မဟုတ် စစ်ဆေးပါ။

အစီအစဉ်တောင်းဆိုရန်-

pagila=# EXPLAIN SELECT title FROM film
pagila-# WHERE special_features @> '{"Behind The Scenes"}';
                           QUERY PLAN
-----------------------------------------------------------------
 Seq Scan on film  (cost=0.00..67.50 rows=5 width=15)
   Filter: (special_features @> '{"Behind The Scenes"}'::text[])
(2 rows)

ကုန်ကျစရိတ် 67 ဖြင့် အပြည့်အစုံ စကင်ဖတ်ရန် တောင်းဆိုထားသည်။

ပုံမှန် B-tree အညွှန်းကိန်းက ကျွန်ုပ်တို့ကို ကူညီပေးသလား ကြည့်ရအောင်။

pagila=# CREATE INDEX idx_film1 ON film(special_features);
CREATE INDEX
pagila=# EXPLAIN SELECT title FROM film
pagila-# WHERE special_features @> '{"Behind The Scenes"}';
                           QUERY PLAN
-----------------------------------------------------------------
 Seq Scan on film  (cost=0.00..67.50 rows=5 width=15)
   Filter: (special_features @> '{"Behind The Scenes"}'::text[])
(2 rows)

အညွှန်းတောင် ထည့်မစဉ်းစားဘူး။ B-tree အညွှန်းကိန်းသည် အညွှန်းကိန်းတန်ဖိုးများတွင် တစ်ခုချင်းဒြပ်စင်များ ရှိနေကြောင်းကို မသိပါ။

ကျွန်ုပ်တို့သည် GIN အညွှန်းကိန်းတစ်ခုလိုသည်။

pagila=# CREATE INDEX idx_film2 ON film USING GIN(special_features);
CREATE INDEX
pagila=# EXPLAIN SELECT title FROM film
pagila-# WHERE special_features @> '{"Behind The Scenes"}';
                                QUERY PLAN
---------------------------------------------------------------------------
 Bitmap Heap Scan on film  (cost=8.04..23.58 rows=5 width=15)
   Recheck Cond: (special_features @> '{"Behind The Scenes"}'::text[])
   ->  Bitmap Index Scan on idx_film2  (cost=0.00..8.04 rows=5 width=0)
         Index Cond: (special_features @> '{"Behind The Scenes"}'::text[])
(4 rows)

GIN အညွှန်းကိန်းသည် အညွှန်းကိန်းပေါင်းစပ်ထားသောတန်ဖိုးများနှင့် မြေပုံတစ်ခုချင်းတန်ဖိုးများကို ပံ့ပိုးပေးသည်၊ ရလဒ်အနေဖြင့် query plan ကုန်ကျစရိတ်သည် ထက်ဝက်ကျော်သည်။

ပွားနေသော အညွှန်းများကို ဖယ်ရှားခြင်း။

အညွှန်းများသည် အချိန်ကြာလာသည်နှင့်အမျှ စုပုံလာကာ တစ်ခါတစ်ရံတွင် အညွှန်းအသစ်တစ်ခုတွင် ယခင်တစ်ခုနှင့်တစ်ခုကဲ့သို့ တူညီသောအဓိပ္ပါယ်ဖွင့်ဆိုမှုများပါရှိသည်။ အညွှန်းများ၏ လူသားဖတ်နိုင်သော SQL အဓိပ္ပါယ်ဖွင့်ဆိုချက်များကို ရယူရန် ကတ်တလောက်မြင်ကွင်းကို သင်အသုံးပြုနိုင်သည်။ pg_indexes. အလားတူ အဓိပ္ပါယ်ဖွင့်ဆိုချက်များကိုလည်း အလွယ်တကူ ရှာဖွေနိုင်သည်-

 SELECT array_agg(indexname) AS indexes, replace(indexdef, indexname, '') AS defn
    FROM pg_indexes
GROUP BY defn
  HAVING count(*) > 1;
And here’s the result when run on the stock pagila database:
pagila=#   SELECT array_agg(indexname) AS indexes, replace(indexdef, indexname, '') AS defn
pagila-#     FROM pg_indexes
pagila-# GROUP BY defn
pagila-#   HAVING count(*) > 1;
                                indexes                                 |                                defn
------------------------------------------------------------------------+------------------------------------------------------------------
 {payment_p2017_01_customer_id_idx,idx_fk_payment_p2017_01_customer_id} | CREATE INDEX  ON public.payment_p2017_01 USING btree (customer_id
 {payment_p2017_02_customer_id_idx,idx_fk_payment_p2017_02_customer_id} | CREATE INDEX  ON public.payment_p2017_02 USING btree (customer_id
 {payment_p2017_03_customer_id_idx,idx_fk_payment_p2017_03_customer_id} | CREATE INDEX  ON public.payment_p2017_03 USING btree (customer_id
 {idx_fk_payment_p2017_04_customer_id,payment_p2017_04_customer_id_idx} | CREATE INDEX  ON public.payment_p2017_04 USING btree (customer_id
 {payment_p2017_05_customer_id_idx,idx_fk_payment_p2017_05_customer_id} | CREATE INDEX  ON public.payment_p2017_05 USING btree (customer_id
 {idx_fk_payment_p2017_06_customer_id,payment_p2017_06_customer_id_idx} | CREATE INDEX  ON public.payment_p2017_06 USING btree (customer_id
(6 rows)

Superset အညွှန်းများ

သင်သည် အညွှန်းများစွာဖြင့် အဆုံးသတ်နိုင်ပြီး၊ တစ်ခုသည် အခြားအညွှန်းကိန်းများကို အညွှန်းပေးသည့် ကော်လံများ၏ စူပါဆက်တစ်ခုကို ညွှန်းပေးသည်။ ၎င်းသည် နှစ်လိုဖွယ်ဖြစ်နိုင်သည် သို့မဟုတ် မဖြစ်ကောင်းဖြစ်နိုင်သည်—စူပါဆက်တ်သည် အညွှန်း-သီးသန့်စကင်န်ဖတ်ခြင်းများကို ဖြစ်ပေါ်စေနိုင်သည်၊ ၎င်းသည် ကောင်းမွန်သော်လည်း နေရာအလွန်များစွာယူနိုင်သည်၊ သို့မဟုတ် ပိုကောင်းအောင်ပြုလုပ်ရန် ရည်ရွယ်ထားသည့် စူပါဆက်တ်၏မေးမြန်းချက်ကို အသုံးမပြုတော့ပါ။

ထိုသို့သော အညွှန်းကိန်းများ၏ အဓိပ္ပါယ်ဖွင့်ဆိုချက်ကို အလိုအလျောက်လုပ်ရန် လိုအပ်ပါက၊ သင်သည် ဖြင့် စတင်နိုင်သည်။ pg_index စားပွဲမှ pg_catalog.

အသုံးမပြုသော အညွှန်းများ

ဒေတာဘေ့စ်များကို အသုံးပြုသည့် အပလီကေးရှင်းများ တိုးတက်ပြောင်းလဲလာသည်နှင့်အမျှ ၎င်းတို့အသုံးပြုသည့် မေးခွန်းများကို လုပ်ဆောင်ပါ။ အစောပိုင်းတွင် ထည့်သွင်းထားသော အညွှန်းများကို မည်သည့်မေးမြန်းမှုမှ အသုံးမပြုတော့ပါ။ အညွှန်းတစ်ခုကို စကန်ဖတ်လိုက်တိုင်း၊ ၎င်းကို စာရင်းအင်းမန်နေဂျာက အမှတ်အသားပြုပြီး စနစ်ကတ်တလောက်မြင်ကွင်းတွင် ဖြစ်သည်။ pg_stat_user_indexes တန်ဖိုးကို သင်မြင်နိုင်သည်။ idx_scanတိုးပွားလာသော တန်ပြန်တစ်ခုဖြစ်သည်။ ဤတန်ဖိုးကို အချိန်အတိုင်းအတာတစ်ခုအထိ (တစ်လပြောပါ) ကိုခြေရာခံခြင်းသည် မည်သည့်ညွှန်းကိန်းများကို အသုံးမပြုဘဲ ကျဆင်းသွားနိုင်သည်ကို ကောင်းစွာ အကြံဉာဏ်ပေးလိမ့်မည်။

ဤသည်မှာ schema ရှိ အညွှန်းအားလုံး၏ လက်ရှိစကင်ဖတ်စစ်ဆေးခြင်းအရေအတွက်ကို ရယူရန် စုံစမ်းမှုတစ်ခုဖြစ်သည်။ ‘public’:

SELECT relname, indexrelname, idx_scan
FROM   pg_catalog.pg_stat_user_indexes
WHERE  schemaname = 'public';
with output like this:
pagila=# SELECT relname, indexrelname, idx_scan
pagila-# FROM   pg_catalog.pg_stat_user_indexes
pagila-# WHERE  schemaname = 'public'
pagila-# LIMIT  10;
    relname    |    indexrelname    | idx_scan
---------------+--------------------+----------
 customer      | customer_pkey      |    32093
 actor         | actor_pkey         |     5462
 address       | address_pkey       |      660
 category      | category_pkey      |     1000
 city          | city_pkey          |      609
 country       | country_pkey       |      604
 film_actor    | film_actor_pkey    |        0
 film_category | film_category_pkey |        0
 film          | film_pkey          |    11043
 inventory     | inventory_pkey     |    16048
(10 rows)

သော့ခတ်နည်းများဖြင့် အညွှန်းများကို ပြန်လည်တည်ဆောက်ခြင်း။

အညွှန်းများသည် ဖောင်းလာသောအခါတွင်၊ ဥပမာအားဖြင့် ပြန်လည်တည်ဆောက်ရန် လိုအပ်ပြီး ပြန်လည်တည်ဆောက်ခြင်းသည် စကင်န်ကို အရှိန်မြှင့်နိုင်သည်။ အညွှန်းကိန်းများသည်လည်း ပျက်စီးသွားနိုင်သည်။ အညွှန်းဘောင်များကို ပြောင်းလဲခြင်းသည်လည်း ၎င်းကို ပြန်လည်တည်ဆောက်ရန် လိုအပ်နိုင်သည်။

အပြိုင်အညွှန်းဖန်တီးမှုကို ဖွင့်ပါ။

PostgreSQL 11 တွင် B-Tree အညွှန်းကိုဖန်တီးခြင်းသည် တစ်ပြိုင်တည်းဖြစ်သည်။ ဖန်တီးမှုလုပ်ငန်းစဉ်ကို အရှိန်မြှင့်ရန်၊ အပြိုင်လုပ်သားများစွာကို အသုံးပြုနိုင်သည်။ သို့သော်၊ ဤဖွဲ့စည်းမှုရွေးချယ်စရာများကို မှန်ကန်စွာသတ်မှတ်ထားကြောင်း သေချာပါစေ။

SET max_parallel_workers = 32;
SET max_parallel_maintenance_workers = 16;

မူရင်းတန်ဖိုးများသည် သေးငယ်လွန်းသည်။ အကောင်းဆုံးမှာ၊ ဤနံပါတ်များသည် ပရိုဆက်ဆာ core အရေအတွက်နှင့်အတူ တိုးသင့်သည်။ တွင်ပိုမိုဖတ်ရှုပါ။ စာရွက်စာတမ်း.

နောက်ခံအညွှန်းဖန်တီးခြင်း။

ရွေးချယ်မှုကို အသုံးပြု၍ နောက်ခံတွင် အညွှန်းတစ်ခု ဖန်တီးနိုင်သည်။ CONCURRENTLY ပညတ်တော်တို့ကို CREATE INDEX:

pagila=# CREATE INDEX CONCURRENTLY idx_address1 ON address(district);
CREATE INDEX

ဤအညွှန်းဖန်တီးမှုလုပ်ထုံးလုပ်နည်းသည် စားပွဲပေါ်တွင်သော့ခတ်ရန်မလိုအပ်သောကြောင့် ပုံမှန်ပုံစံနှင့် ကွဲပြားသောကြောင့် စာရေးခြင်းလုပ်ဆောင်မှုများကို ပိတ်ဆို့ထားခြင်းမရှိပါ။ အခြားတစ်ဖက်တွင်၊ ၎င်းသည် အချိန်ပိုယူ၍ အရင်းအမြစ်များကို ပိုမိုသုံးစွဲသည်။

Postgres သည် အညွှန်းများဖန်တီးခြင်းနှင့် အထူးကိစ္စရပ်တစ်ခုခုကို ဖြေရှင်းရန် နည်းလမ်းများအပြင် သင့်အက်ပ်လီကေးရှင်းကြီးထွားလာပါက ဒေတာဘေ့စ်ကို စီမံခန့်ခွဲရန် နည်းလမ်းများစွာကို ပံ့ပိုးပေးပါသည်။ ဤအကြံပြုချက်များသည် သင့်မေးမြန်းချက်များကို လျင်မြန်စွာရရှိရန်နှင့် သင့်ဒေတာဘေ့စ်ကို အတိုင်းအတာအထိ အဆင်သင့်ဖြစ်နေစေရန် ကူညီပေးလိမ့်မည်ဟု မျှော်လင့်ပါသည်။

source: www.habr.com

DDoS ကာကွယ်ရေး၊ VPS VDS ဆာဗာများပါသည့် ဆိုက်များအတွက် ယုံကြည်စိတ်ချရသော hosting ကို ဝယ်ယူပါ။ 🔥 DDoS ကာကွယ်မှု၊ VPS VDS ဆာဗာများပါရှိသော ယုံကြည်စိတ်ချရသော ဝဘ်ဆိုက် hosting ကို ဝယ်ယူပါ | ProHoster