100,000 রেকর্ড সহ মাইএসকিউএল টেবিল প্রায়শই জিজ্ঞাসা করা হয়


11

বিভিন্ন ধরণের তথ্য সঞ্চয় করার জন্য আমার কাছে প্রায় 100 টি টেবিলের একক ডাটাবেস রয়েছে।

সর্বাধিক গুরুত্বপূর্ণ সারণী হ'ল আমাদের অর্ডার সারণী যা গ্রাহকদের অর্ডার সঞ্চয় করতে ব্যবহৃত হয় এবং এখন এবং বেড়ে ওঠা হিসাবে 100000 রেকর্ডেরও বেশি।

রিয়েল টাইম অর্ডার ড্যাশবোর্ড, পরিসংখ্যান, বিশ্লেষণ ইত্যাদি থেকে প্রয়োজনীয় তথ্যের বিভিন্ন অংশের জন্য এই ডাটাবেসটি আমাদের ডাটাবেসের সর্বাধিক সন্ধানী সারণী is

আমি নিয়মিতভাবে ডাটাবেস নিরীক্ষণ করি এবং সমস্যাগুলি ট্র্যাক করতে ডাটাবেসে ধীরে ধীরে প্রশ্নগুলি সক্ষম করে তুলেছি।

আমি প্রতিদিনের ভিত্তিতে ক্যোয়ারীটি ছিটিয়ে দিতে মাইএসকিএলটিউনারের মতো স্ক্রিপ্ট ব্যবহার করি।

আমি আমাদের ডাটাবেসে শীর্ষ 10 ধীরতম কোয়েরি সম্পর্কিত তথ্য সংগ্রহ করতে mysqlsla ব্যবহার করি।

sample stat
Count         : 11.48k  (30.66%)
Time          : 19.623758 s total, 1.709 ms avg, 239 µs to 2.475017 s max  (18.64%)
  95% of Time : 5.246833 s total, 481 µs avg, 239 µs to 1.095 ms max
Lock Time (s) : 14.460071 s total, 1.259 ms avg, 53 µs to 2.462555 s max  (41.38%)
  95% of Lock : 806.43 ms total, 74 µs avg, 53 µs to 137 µs max
Rows sent     : 1 avg, 0 to 9 max  (0.99%)
Rows examined : 6 avg, 1 to 28 max  (0.15%)

ধীরে ধীরে অনুসন্ধান করা বেশিরভাগটিতে উপরে উল্লিখিত অর্ডার সারণী জড়িত। আমি মাইআইএসএএমকে আমার স্টোরেজ ইঞ্জিন হিসাবে ব্যবহার করি যাতে সম্ভব সমস্যাগুলি হতে পারে:

  1. টেবিল লকিং
  2. সূচকের বিষয়গুলি

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

টেবিল স্কিমা

`orderid` int(11) NOT NULL AUTO_INCREMENT,
`cityid` tinyint(3) unsigned NOT NULL DEFAULT '1',
 `model_type` tinyint(1) unsigned DEFAULT '1',
`userid` int(11) DEFAULT NULL,
`usertype` char(1) DEFAULT NULL,
`time` time DEFAULT NULL,
`ordercode` char(8) DEFAULT NULL,
`restid` smallint(3) unsigned NOT NULL,
`areaid` smallint(3) unsigned DEFAULT NULL,
`restname` varchar(50) DEFAULT NULL,
`date` date NOT NULL,
`del_time` time NOT NULL,
`status` tinyint(3) unsigned NOT NULL,
`amount` float NOT NULL,
`deliverycharge` smallint(4) unsigned DEFAULT '0',
`tax` float NOT NULL,
`total` float NOT NULL,
`extras` varchar(255) DEFAULT NULL,
`requests` varchar(255) DEFAULT NULL,
`discount` float DEFAULT NULL,
`rdiscount` float DEFAULT NULL,
`reason` varchar(255) DEFAULT NULL,
`rest_order` tinyint(1) unsigned DEFAULT NULL,
`admin_user` varchar(25) DEFAULT NULL,
`mode` char(1) NOT NULL,
`priority_order` tinyint(1) unsigned DEFAULT '0',
`payment_mode` tinyint(1) unsigned DEFAULT '0',
`km` tinyint(3) unsigned DEFAULT NULL,
`order_type` tinyint(1) NOT NULL DEFAULT '1',
`coupon_discount` smallint(3) DEFAULT '0',
`pickup_time` time NOT NULL,
PRIMARY KEY (`orderid`),
KEY `cityid` (`cityid`),
KEY `date_3` (`date`,`status`,`mode`),
KEY `orderid` (`orderid`),
KEY `time` (`time`),
KEY `userid` (`userid`,`usertype`),
KEY `restid` (`restid`,`date`,`status`)

ধীর লগ ক্যোয়ারী

SELECT `a`.`orderid`, `a`.`date`, `a`.`status`, `a`.`restname`, `a`.`admin_user`, `a`.`model_type`, `b`.`name` as cityname
FROM `tk_order_queue` AS a
INNER JOIN `tk_cities` AS b ON `a`.`cityid` = `b`.`id`
WHERE `a`.`date` =  '2012-06-30'
AND `a`.`status` =  0
AND `a`.`mode` =  1
ORDER BY `a`.`orderid` desc;

দয়া করে চালান SHOW CREATE TABLE orders\Gএবং পোস্ট করুন পোস্ট করুন
RolandoMySQLDBA

2
আমি কি এটি ভুলভাবে পড়ছি, বা গড় জিজ্ঞাসার সময়টি 1.7ms? পৃথিবীতে কেন আপনি এই গতি বাড়িয়ে দেখবেন?
ফিলি

এটি কেন ধীর ক্যোয়ারি লগগুলিতে উপস্থিত হয় তা সম্পর্কে আমি কিছুটা বিভ্রান্ত।
শেলডন

@RolandoMySQLDBA আমি স্কিমা সংযুক্ত করেছি
Sheldon

1
কেবলমাত্র টেবিলে আপনার সূচী রয়েছে তার অর্থ এই নয় যে সেগুলি আপনার প্রশ্নের জন্য সঠিক সূচক। আপনি কি ধীর অনুসন্ধানের কয়েকটি উদাহরণ এবং তাদের এক্সপ্লেইন আউটপুট পোস্ট করতে পারেন? এছাড়াও, কত বার আদেশ সারণী আপডেট করা হয়?
বোবুইনহোল্ট

উত্তর:


8

আপনার বর্তমান সূচীগুলি তাদের বর্ণনামূলক পরিকল্পনায় তাদের সমর্থন করতে পারে তা নিশ্চিত করার জন্য আপনাকে আপনার সমস্ত প্রশ্নের বিবরণী ও গোপনীয়তার বিবরণগুলি ও গ্রুপের সাথে তুলনা করতে হবে।

গতকাল, আমি এই প্রশ্নের উত্তর দিয়েছি: InnoDB বনাম মাইআইএসএএম অনেক সূচক সহ

এই প্রশ্নে আমি মাইআইএসএএম টেবিলটিতে এমন কিছু করার পরামর্শ দিয়েছিলাম যা আপনিও করতে পারেন

ALTER TABLE orders ROW_FORMAT=Fixed;

এটি সমস্ত ভ্রচারকে চর হিসাবে বিবেচনা করবে। প্রতিটি সারি হুবহু একই দৈর্ঘ্য হবে। এটি ডিস্কের স্থানটি 80% -100% বাড়িয়ে তুলবে। আপনার টেবিলটি সারি সজ্জার সারণির সারণির সর্বাধিক আকারে ফুলবে। আপনার টেবিলটি আকারে দ্বিগুণ বা ট্রিপল হতে পারে।

সুবিধা কোথায়? আপনার মাইআইএসএএম টেবিলটি অন্য কোনও কিছু পরিবর্তন না করেই 20% - 30% দ্রুত থেকে কোথাও লেখা / পাঠানো হবে।

আমি মাইএসকিউএল ডেটাবেস ডিজাইন এবং টিউনিং থেকে 72,73 পৃষ্ঠা থেকে শিখেছি ।

আমি অতীতে এই সম্পর্কে লিখেছি:


বিশদ ব্যাখ্যার জন্য ধন্যবাদ, হ্যাঁ সারণীতে যুক্ত সূচকগুলি আমাদের সিস্টেমে ব্যবহৃত বিবৃতি অনুসারে বাছাই করা, দলবদ্ধভাবে এবং ক্রমের জন্য ব্যবহৃত প্রশ্নের উপর ভিত্তি করে তৈরি করা হয়েছে। ইনডেক্স লগ ব্যতীত প্রশ্নগুলি পর্যবেক্ষণ করে এবং সে অনুযায়ী টেবিলগুলি আপডেট করে চলেছে।
শেলডন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.