যোগদানের টেবিলগুলির কলামগুলি অনুসারে বাছাই করার কোনও উপায় আছে কি?


10

এটি আমার ধীরে ধীরে প্রশ্ন:

SELECT `products_counts`.`cid`
FROM
  `products_counts` `products_counts`

  LEFT OUTER JOIN `products` `products` ON (
  `products_counts`.`product_id` = `products`.`id`
  )
  LEFT OUTER JOIN `trademarks` `trademark` ON (
  `products`.`trademark_id` = `trademark`.`id`
  )
  LEFT OUTER JOIN `suppliers` `supplier` ON (
  `products_counts`.`supplier_id` = `supplier`.`id`
  )
WHERE
  `products_counts`.product_id IN
  (159, 572, 1075, 1102, 1145, 1162, 1660, 2355, 2356, 2357, 3236, 6471, 6472, 6473, 8779, 9043, 9095, 9336, 9337, 9338, 9445, 10198, 10966, 10967, 10974, 11124, 11168, 16387, 16689, 16827, 17689, 17920, 17938, 17946, 17957, 21341, 21352, 21420, 21421, 21429, 21544, 27944, 27988, 30194, 30196, 30230, 30278, 30699, 31306, 31340, 32625, 34021, 34047, 38043, 43743, 48639, 48720, 52453, 55667, 56847, 57478, 58034, 61477, 62301, 65983, 66013, 66181, 66197, 66204, 66407, 66844, 66879, 67308, 68637, 73944, 74037, 74060, 77502, 90963, 101630, 101900, 101977, 101985, 101987, 105906, 108112, 123839, 126316, 135156, 135184, 138903, 142755, 143046, 143193, 143247, 144054, 150164, 150406, 154001, 154546, 157998, 159896, 161695, 163367, 170173, 172257, 172732, 173581, 174001, 175126, 181900, 182168, 182342, 182858, 182976, 183706, 183902, 183936, 184939, 185744, 287831, 362832, 363923, 7083107, 7173092, 7342593, 7342594, 7342595, 7728766)
ORDER BY
  products_counts.inflow ASC,
  supplier.delivery_period ASC,
  trademark.sort DESC,
  trademark.name ASC
LIMIT
  0, 3;

আমার ডেটাসেটের গড় ক্যোয়ারির সময়কাল 4.5 সে এবং এটি অগ্রহণযোগ্য।

সমাধানগুলি আমি দেখতে পাই:

আদেশের ধারা থেকে products_countsটেবিলের সমস্ত কলাম যুক্ত করুন । তবে অ্যাপ্লিকেশনটিতে আমার কাছে ~ 10 অর্ডার প্রকার রয়েছে, সুতরাং আমার প্রচুর কলাম এবং সূচি তৈরি করা উচিত। প্লাসের products_countsখুব নিবিড়ভাবে আপডেট / সন্নিবেশ / মুছে ফেলা আছে, সুতরাং আমাকে তাত্ক্ষণিকভাবে সম্পর্কিত সমস্ত কলামগুলি (ট্রিগারগুলি ব্যবহার করে) আপডেট করতে হবে?

অন্য কোন সমাধান আছে কি?

ব্যাখ্যা করা:

+----+-------------+-----------------+--------+---------------------------------------------+------------------------+---------+----------------------------------+------+----------------------------------------------+
| id | select_type | table           | type   | possible_keys                               | key                    | key_len | ref                              | rows | Extra                                        |
+----+-------------+-----------------+--------+---------------------------------------------+------------------------+---------+----------------------------------+------+----------------------------------------------+
|  1 | SIMPLE      | products_counts | range  | product_id_supplier_id,product_id,pid_count | product_id_supplier_id | 4       | NULL                             |  227 | Using where; Using temporary; Using filesort |
|  1 | SIMPLE      | products        | eq_ref | PRIMARY                                     | PRIMARY                | 4       | uaot.products_counts.product_id  |    1 |                                              |
|  1 | SIMPLE      | trademark       | eq_ref | PRIMARY                                     | PRIMARY                | 4       | uaot.products.trademark_id       |    1 |                                              |
|  1 | SIMPLE      | supplier        | eq_ref | PRIMARY                                     | PRIMARY                | 4       | uaot.products_counts.supplier_id |    1 |                                              |
+----+-------------+-----------------+--------+---------------------------------------------+------------------------+---------+----------------------------------+------+----------------------------------------------+

টেবিল কাঠামো:

CREATE TABLE `products_counts` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `product_id` int(11) unsigned NOT NULL,
  `supplier_id` int(11) unsigned NOT NULL,
  `count` int(11) unsigned NOT NULL,
  `cid` varchar(64) NOT NULL,
  `inflow` varchar(10) NOT NULL,
  `for_delete` tinyint(1) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  UNIQUE KEY `cid` (`cid`),
  UNIQUE KEY `product_id_supplier_id` (`product_id`,`supplier_id`),
  KEY `product_id` (`product_id`),
  KEY `count` (`count`),
  KEY `pid_count` (`product_id`,`count`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `products` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `external_id` varchar(36) NOT NULL,
  `name` varchar(255) NOT NULL,
  `category_id` int(11) unsigned NOT NULL,
  `trademark_id` int(11) unsigned NOT NULL,
  `photo` varchar(255) NOT NULL,
  `sort` int(11) unsigned NOT NULL,
  `otech` tinyint(1) unsigned NOT NULL,
  `not_liquid` tinyint(1) unsigned NOT NULL DEFAULT '0',
  `applicable` varchar(255) NOT NULL,
  `code_main` varchar(64) NOT NULL,
  `code_searchable` varchar(128) NOT NULL,
  `total` int(11) unsigned NOT NULL,
  `slider` int(11) unsigned NOT NULL,
  `slider_title` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `external_id` (`external_id`),
  KEY `category_id` (`category_id`),
  KEY `trademark_id` (`trademark_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `trademarks` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `external_id` varchar(36) NOT NULL,
  `name` varchar(255) NOT NULL,
  `country_id` int(11) NOT NULL,
  `sort` int(11) unsigned NOT NULL DEFAULT '0',
  `sort_list` int(10) unsigned NOT NULL DEFAULT '0',
  `is_featured` tinyint(1) unsigned NOT NULL,
  `is_direct` tinyint(1) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  UNIQUE KEY `external_id` (`external_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `suppliers` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `external_id` varchar(36) NOT NULL,
  `code` varchar(64) NOT NULL,
  `name` varchar(255) NOT NULL,
  `delivery_period` tinyint(1) unsigned NOT NULL,
  `is_default` tinyint(1) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  KEY `external_id` (`external_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

মাইএসকিউএল সার্ভারের তথ্য:

mysqld  Ver 5.5.45-1+deb.sury.org~trusty+1 for debian-linux-gnu on i686 ((Ubuntu))

3
আপনি কি ইনডেক্স, টেবিল স্কিমা এবং পরীক্ষার ডেটা সহ একটি এসকিউএল ফিডল সরবরাহ করতে পারেন? এছাড়াও আপনার লক্ষ্য সময় কি? আপনি কি এটি 3 সেকেন্ড, 1 সেকেন্ড, 50 মিলিসেকেন্ডে সম্পূর্ণ করতে চাইছেন? 1 কে, 100 কে, 100 এম বিভিন্ন টেবিলগুলিতে আপনার কতটি রেকর্ড রয়েছে?
এরিক 21

আপনি যে ক্ষেত্রগুলি বাছাই করছেন সেগুলি যদি সূচিযুক্ত না করা হয় এবং ডেটা সেট করা সত্যিই বড় হয় আপনি সম্ভবত কোনও সাজানো_ বাফার_সাইজ সমস্যাটির দিকে তাকিয়ে থাকতে পারেন? আপনি আপনার সেশনে আপনার মানটি পরিবর্তনের চেষ্টা করতে পারেন এবং কোয়েরিটি উন্নত হয় কিনা তা চালনা করতে পারেন।
ব্রায়ান এফটিং

আপনি কি একটি সূচক যুক্ত করার চেষ্টা করেছেন (inflow, product_id)?
ypercubeᵀᴹ

আপনার একটি শালীন আছে তা নিশ্চিত করুন innodb_buffer_pool_size। সাধারণত উপলব্ধ র্যামের প্রায় 70% ভাল।
রিক জেমস

উত্তর:


6

আপনার টেবিলের সংজ্ঞা পর্যালোচনা করলে বোঝা যায় যে আপনি জড়িত সারণির সাথে জুড়ে সূচিগুলি মেলে। এটি MySQL'sযুক্ত যুক্তির সীমাতে যত তাড়াতাড়ি সম্ভব যোগদানের কারণ হওয়া উচিত ।

তবে একাধিক টেবিল থেকে বাছাই করা আরও জটিল।

2007 সালে সের্গেই পেট্রুনিয়া MySQLগতি অনুসারে 3 বাছাই করা অ্যালগরিদমগুলিতে বর্ণনা করেছেন MySQL: http://s.petrunia.net/blog/?m=201407

  1. আদেশযুক্ত আউটপুট উত্পাদন করে এমন সূচক-ভিত্তিক অ্যাক্সেস পদ্ধতি ব্যবহার করুন
  2. filesort()1 ম অ স্থির টেবিল ব্যবহার করুন
  3. অস্থায়ী টেবিলে যোগদানের ফলাফলটি রাখুন এবং filesort()এটি ব্যবহার করুন

উপরে প্রদর্শিত সারণী সংজ্ঞা এবং যোগদানগুলি থেকে আপনি দেখতে পাচ্ছেন যে আপনি কখনই দ্রুততম বাছাই করতে পারবেন না । এর অর্থ হ'ল আপনি যে filesort()ধরণের মানদণ্ডটি ব্যবহার করছেন তা নির্ভর করে।

তবে, আপনি যদি একটি ম্যাটেরিয়াল ভিউ ডিজাইন করেন এবং ব্যবহার করেন তবে আপনি এটি ব্যবহার করতে সক্ষম হবেন দ্রুততম সাজানোর অ্যালগরিদম ।

MySQL 5.5বাছাই পদ্ধতির জন্য সংজ্ঞায়িত বিশদটি দেখতে দেখুন: http://dev.mysql.com/doc/refman/5.5/en/order-by-optimization.html

জন্য MySQL 5.5 (এই উদাহরণে) বৃদ্ধি ORDER BYগতি যদি তুমি না পেতে পারেন MySQLএকটি অতিরিক্ত বাছাই পর্বে বদলে ইনডেক্স ব্যবহার করতে, নিম্নলিখিত কৌশল চেষ্টা করে দেখুন:

The sort_buffer_sizeপরিবর্তনশীল মান বৃদ্ধি করুন ।

• বর্ধিত করা read_rnd_buffer_sizeপরিবর্তনশীল মান ।

Row আসল মানগুলি সংরক্ষণের জন্য প্রয়োজনীয় পরিমাণে কেবলমাত্র কলামগুলি ঘোষনা করে প্রতি সারিতে কম র‌্যাম ব্যবহার করুন। [উদাহরণস্বরূপ ভার্চরকে হ্রাস করুন (256) থেকে ভারচারে (অ্যাকুয়াললজটেস্ট স্ট্রিং)]

Large tmpdirসিস্টেমের ভেরিয়েবলকে প্রচুর পরিমাণে মুক্ত স্থান সহ একটি ডেডিকেটেড ফাইল সিস্টেমে দেখানোতে পরিবর্তন করুন। (অন্যান্য বিবরণ উপরের লিঙ্কে দেওয়া হয়।)

গতি MySQL 5.7বাড়াতে ডকুমেন্টেশনে আরও বিশদ দেওয়া আছে, যার মধ্যে কিছুটা সামান্য উন্নত আচরণ হতে পারে :ORDER

http://dev.mysql.com/doc/refman/5.7/en/order-by-optimization.html

ধাতবীকৃত দর্শন - যোগ করা টেবিলগুলি বাছাই করার জন্য আলাদা ধারণা

আপনি উল্লিখিত রূপায়িত দেখেছে আপনার প্রশ্নের ট্রিগার ব্যবহার উল্লেখ করেন। মাইএসকিউএল কোনও ম্যাটেরিয়ালাইজড ভিউ তৈরি করতে কার্যকারিতা তৈরি করে নি তবে আপনার কাছে প্রয়োজনীয় সরঞ্জামগুলি রয়েছে। লোড ছড়িয়ে দিতে ট্রিগার ব্যবহার করে আপনি মুহুর্ত পর্যন্ত ম্যাটারিয়ালাইজড ভিউ বজায় রাখতে পারবেন ।

রূপায়িত দেখুন আসলে একটি হয় টেবিল যা জনবহুল হয় পদ্ধতিগত কোড মাধ্যমে গড়ে তুলতে বা পুনর্নির্মাণের রূপায়িত দেখুন এবং ট্রিগার দ্বারা পরিচালিত আপ-টু-ডেট তথ্য রাখা।

যেহেতু আপনি একটি টেবিল তৈরি করছেন যার একটি সূচক থাকবে , তারপরে জিজ্ঞাসা করা হলে ম্যাটিমাইজড ভিউ দ্রুততম বাছাইয়ের পদ্ধতিটি ব্যবহার করতে পারে : আদেশযুক্ত আউটপুট উত্পাদনকারী সূচি-ভিত্তিক অ্যাক্সেস পদ্ধতি ব্যবহার করুন

যেহেতু MySQL 5.5ব্যবহারসমূহ ট্রিগার একটি বজায় রাখার জন্য রূপায়িত দেখুন , এছাড়াও আপনি একটি প্রক্রিয়া, স্ক্রিপ্ট, বা সঞ্চয় করে প্রাথমিক গড়ে তুলতে পদ্ধতি করতে হবে রূপায়িত দেখুন

আপনি যে ডেটা পরিচালনা করেন তা বেস টেবিলগুলিতে প্রতিটি আপডেটের পরে চালানোর পক্ষে এটি অবশ্যই খুব ভারী। সেই কারণেই পরিবর্তনগুলি যেমন রয়েছে তেমনি ডেটা আপডেট করে রাখতে ট্রিগাররা খেলতে আসে। এইভাবে প্রতিটি insert, updateএবং deleteআপনার ট্রিগারগুলি ব্যবহার করে ম্যাটেরিয়ালাইজড ভিউতে তাদের পরিবর্তনগুলি প্রচার করবে ।

Http://www.fromdual.com/ এ FROMDUAL সংস্থার একটি ম্যাটেরিয়ালাইজড ভিউ বজায় রাখার জন্য নমুনা কোড রয়েছে । সুতরাং, আমার নিজের নমুনাগুলি লেখার চেয়ে আমি আপনাকে তাদের নমুনাগুলির দিকে নির্দেশ করব:

http://www.fromdual.com/mysql-materialized-views

উদাহরণ 1: একটি ধাতব দৃষ্টিভঙ্গি তৈরি করা Building

DROP TABLE sales_mv;
CREATE TABLE sales_mv (
    product_name VARCHAR(128)  NOT NULL
  , price_sum    DECIMAL(10,2) NOT NULL
  , amount_sum   INT           NOT NULL
  , price_avg    FLOAT         NOT NULL
  , amount_avg   FLOAT         NOT NULL
  , sales_cnt    INT           NOT NULL
  , UNIQUE INDEX product (product_name)
);

INSERT INTO sales_mv
SELECT product_name
    , SUM(product_price), SUM(product_amount)
    , AVG(product_price), AVG(product_amount)
    , COUNT(*)
  FROM sales
GROUP BY product_name;

রিফ্রেশের মুহুর্তে এটি আপনাকে ম্যাটারিয়ালাইজড ভিউ দেয় । তবে আপনার যেহেতু দ্রুত গতিশীল ডাটাবেস রয়েছে তাই আপনি এই ভিউটিকে যতটা সম্ভব আপ টু ডেট রাখতে চান।

সুতরাং ক্ষতিগ্রস্থ বেস ডাটা টেবিলগুলিকে বেস টেবিল থেকে ম্যাটেরিয়ালাইজড ভিউ টেবিলের পরিবর্তনের প্রচার করতে ট্রিগার থাকা দরকার । একটি উদাহরণ হিসাবে:

উদাহরণ 2: একটি বস্তুগত ভিউতে নতুন ডেটা .োকানো

DELIMITER $$

CREATE TRIGGER sales_ins
AFTER INSERT ON sales
FOR EACH ROW
BEGIN

  SET @old_price_sum = 0;
  SET @old_amount_sum = 0;
  SET @old_price_avg = 0;
  SET @old_amount_avg = 0;
  SET @old_sales_cnt = 0;

  SELECT IFNULL(price_sum, 0), IFNULL(amount_sum, 0), IFNULL(price_avg, 0)
       , IFNULL(amount_avg, 0), IFNULL(sales_cnt, 0)
    FROM sales_mv
   WHERE product_name = NEW.product_name
    INTO @old_price_sum, @old_amount_sum, @old_price_avg
       , @old_amount_avg, @old_sales_cnt
  ;

  SET @new_price_sum = @old_price_sum + NEW.product_price;
  SET @new_amount_sum = @old_amount_sum + NEW.product_amount;
  SET @new_sales_cnt = @old_sales_cnt + 1;
  SET @new_price_avg = @new_price_sum / @new_sales_cnt;
  SET @new_amount_avg = @new_amount_sum / @new_sales_cnt;

  REPLACE INTO sales_mv
  VALUES(NEW.product_name, @new_price_sum, @new_amount_sum, @new_price_avg
       , @new_amount_avg, @new_sales_cnt)
  ;

END;
$$
DELIMITER ;

অবশ্যই, আপনাকে ম্যাটেরিয়ালাইজড ভিউতে ডেটারিয়াল ভিউ এবং ডেটা আপডেট করার ডেটা বজায় রাখার জন্য আপনারও ট্রিগারগুলির প্রয়োজন হবে । এই ট্রিগারগুলির জন্য নমুনাও উপলব্ধ।

সর্বশেষে: কীভাবে এটি সারণি দ্রুততর টেবিলে যোগ দেয়?

রূপায়িত দেখুন হিসাবে আপডেট এটি তৈরি করা হয় ক্রমাগত তৈরি হচ্ছে। সুতরাং আপনি ইনডেক্স (বা সূচকগুলি ) সংজ্ঞায়িত করতে পারেন যা আপনি ধাতবজাতীয় ভিউ বা সারণীতে ডেটা বাছাইয়ের জন্য ব্যবহার করতে চান ।

যদি ডেটা বজায় রাখার ওভারহেড খুব ভারী না হয় তবে আপনি প্রতিটি প্রাসঙ্গিক ডেটা পরিবর্তনের জন্য ম্যাটারিয়ালাইজড ভিউ বজায় রাখার জন্য কিছু সংস্থান (সিপিইউ / আইও / ইত্যাদি) ব্যয় করছেন এবং এভাবে সূচী তথ্যটি আপ টু ডেট এবং সহজেই উপলভ্য। অতএব, নির্বাচনটি দ্রুততর হবে, যেহেতু আপনি:

  1. আপনার নির্বাচনের জন্য ডেটা প্রস্তুত পেতে ইতিমধ্যে ইনক্রিমেন্টাল সিপিইউ এবং আইও ব্যয় করেছেন।
  2. উপর সূচক রূপায়িত দেখুন ব্যবহার করতে পারেন দ্রুততম বাছাই পদ্ধতি , মাইএসকিউএল উপলব্ধ যথা সূচক ভিত্তিক অ্যাক্সেস পদ্ধতি উত্পাদন যে আউটপুট আদেশ ব্যবহার করুন

আপনার পরিস্থিতির উপর নির্ভর করে এবং কিভাবে আপনি সামগ্রিক প্রক্রিয়া সম্পর্কে বোধ, আপনি পুনর্নির্মাণের চাইতে পারেন রূপায়িত প্রতি একটি মন্থর সময়কালে প্রতি রাতে।

নোট: ইন Microsoft SQL Server রূপায়িত দেখেছে উল্লেখ করা হয় সূচিবদ্ধ দেখেছে এবং স্বয়ংক্রিয়ভাবে উপর ভিত্তি করে আপডেট করা হয় সূচিবদ্ধ দেখুন এর মেটাডেটা।


6

এখানে যাওয়ার মতো খুব বেশি কিছু নেই, তবে প্রাথমিক সমস্যাটি অনুমান করছি যে আপনি প্রতিটি সময় বেশ বড় অস্থায়ী টেবিল তৈরি করছেন এবং প্রতিবার ডিস্কে ফাইল বাছাই করুন sort কারণ হ'ল:

  1. আপনি ইউটিএফ 8 ব্যবহার করছেন
  2. আপনি বাছাইয়ের জন্য কিছু বড় বারচার (255) ক্ষেত্র ব্যবহার করছেন

এর অর্থ হল আপনার অস্থায়ী টেবিল এবং সাজানোর ফাইলটি মোটামুটি বড় হতে পারে, যেমন অস্থায়ী টেবিল তৈরি করার সময় MAX দৈর্ঘ্যে ক্ষেত্রগুলি তৈরি করা হয়, এবং রেকর্ডগুলি বাছাই করার সময় সমস্ত MAX দৈর্ঘ্যে থাকে (এবং ইউটিএফ 8 অক্ষর প্রতি 3 বাইট হয়)। এগুলি সম্ভবত ইন-মেমরি অস্থায়ী টেবিলের ব্যবহার বন্ধ করে দিচ্ছে। আরও তথ্যের জন্য অভ্যন্তরীণ টেম্প টেবিলের বিশদটি দেখুন

প্রথম সারিটি কী কী তা জানার আগে আমাদের সম্পূর্ণ ফল সেটটি অর্ডার করতে এবং অর্ডার করা দরকার হওয়ায় লিমিটেড এখানেও আমাদের ভাল কাজ করে না।

আপনি কি নিজের tmpdir কে একটি tmpfs ফাইল সিস্টেমে সরিয়ে দেওয়ার চেষ্টা করেছেন ? যদি / tmp ইতিমধ্যে tmpfs ব্যবহার করে না (MySQL tmpdir=/tmpডিফল্টরূপে * nix ব্যবহার করে), তবে আপনি সরাসরি / dev / shm ব্যবহার করতে পারেন। আপনার my.cnf ফাইলে:

[mysqld]
...
tmpdir=/dev/shm  

তারপরে আপনাকে মাইএসকিএলডি পুনরায় চালু করতে হবে।

এটি একটি বিশাল পার্থক্য করতে পারে । আপনি যদি সিস্টেমে মেমরির চাপের মধ্যে চলে আসতে পারেন তবে মেমরির অংশগুলি ডিস্কে অদলবদল করতে বা এড়াতে আপনি সম্ভবত সাধারণত আকারটি ক্যাপ করতে চান (সাধারণত লিনাক্স ডিফল্টরূপে মোট র্যামের 50% এ টেম্পেফ্স ডিপ্সফ) করে) ওওমের পরিস্থিতি আরও খারাপ । আপনি লাইনটি সম্পাদনা করে এটি করতে পারেন /etc/fstab:

tmpfs                   /dev/shm                tmpfs   rw,size=2G,noexec,nodev,noatime,nodiratime        0 0

আপনি এটি "অনলাইনে "ও আকার পরিবর্তন করতে পারেন। উদাহরণ স্বরূপ:

mount -o remount,size=2G,noexec,nodev,noatime,nodiratime /dev/shm

আপনি মাইএসকিউএল 5.6-এও আপগ্রেড করতে পারেন - এতে পারফরম্যান্ট সাবকিউরিস এবং উত্পন্ন টেবিল রয়েছে - এবং আরও কিছুটা ক্যোয়ারীর সাথে খেলতে পারেন। আমি যা মনে করি তা থেকে, আমরা সেই পথে বড় জয় দেখতে পাব বলে আমি মনে করি না।

শুভকামনা!


আপনার উত্তরের জন্য ধন্যবাদ. Tmpdir কে tmpfs এ সরানো ভাল পারফরম্যান্স লাভ করেছে।
স্ট্যানিস্লাভ গামায়ুনভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.