ตาราง MySQL ที่มีการบันทึก 100,000 ครั้งมีการสอบถามบ่อยครั้ง


11

ฉันมีฐานข้อมูลเดียวประมาณ 100 ตารางเพื่อจัดเก็บข้อมูลประเภทต่างๆ

ตารางที่สำคัญที่สุดคือตารางคำสั่งของเราซึ่งใช้ในการจัดเก็บคำสั่งซื้อของลูกค้าและมีมากกว่า 100,000 รายการ ณ ปัจจุบันและเพิ่มขึ้นเรื่อย ๆ

ตารางนี้เป็นตารางที่มีการสืบค้นมากที่สุดในฐานข้อมูลของเราสำหรับส่วนต่างๆของข้อมูลที่ต้องการจากแดชบอร์ดคำสั่งซื้อแบบเรียลไทม์สถิติการวิเคราะห์และอื่น ๆ

ฉันตรวจสอบฐานข้อมูลเป็นประจำและเปิดใช้งานแบบสอบถามช้าในฐานข้อมูลเพื่อติดตามปัญหา

ฉันใช้สคริปต์เช่น mysqltuner เพื่อคายแบบสอบถามออกทุกวัน

ฉันยังใช้ mysqlsla เพื่อรวบรวมข้อมูลเกี่ยวกับการสืบค้นที่ช้าที่สุด 10 อันดับแรกในฐานข้อมูลของเรา

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%)

แบบสอบถามที่ช้าที่สุดส่วนใหญ่เกี่ยวข้องกับตารางคำสั่งซื้อที่กล่าวถึงข้างต้น ฉันใช้ MyISAM เป็นเครื่องมือจัดเก็บข้อมูลของฉันดังนั้นปัญหาที่อาจเกิดขึ้น:

  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.7 มิลลิวินาทีหรือไม่ ทำไมคุณถึงต้องเร่งความเร็วในโลกนี้?
Philᵀᴹ

ฉันสับสนเล็กน้อยว่าทำไมจึงปรากฏในบันทึกการสืบค้นที่ช้า
ดอน

@RolandoMySQLDBA ฉันได้แนบสคีมา
ดอน

1
เพียงเพราะคุณมีดัชนีในตารางไม่ได้หมายความว่าพวกเขาเป็นดัชนีที่เหมาะสมสำหรับข้อความค้นหาของคุณ คุณสามารถโพสต์ตัวอย่างของการสืบค้นที่ช้าและเอาท์พุทคำอธิบาย นอกจากนี้ตารางคำสั่งซื้อจะได้รับการอัปเดตบ่อยเพียงใด
bobwienholt

คำตอบ:


8

คุณจะต้องเปรียบเทียบประโยคคำสั่ง WHERE และ GROUP BY และ ORDER BY ของแบบสอบถามทั้งหมดของคุณเพื่อให้แน่ใจว่าดัชนีปัจจุบันของคุณสามารถรองรับได้ในแผนอธิบายของพวกเขา

เมื่อวานนี้ผมตอบคำถามนี้: InnoDB MyISAM เทียบกับดัชนีหลาย

ในคำถามนั้นฉันแนะนำให้ทำอะไรบางอย่างในตาราง MyISAM ที่คุณสามารถทำได้เช่นกัน

ALTER TABLE orders ROW_FORMAT=Fixed;

วิธีนี้จะถือว่า VARCHAR ทั้งหมดเป็น CHARs ทุกแถวจะมีความยาวเท่ากัน สิ่งนี้จะเพิ่มพื้นที่ว่างในดิสก์ 80% -100% ตารางของคุณจะขยายให้มีขนาดสูงสุดสำหรับเลย์เอาต์แถวคูณด้วยจำนวนแถว ตารางคุณสามารถเพิ่มขนาดเป็นสองเท่าหรือสามเท่า

ประโยชน์อยู่ที่ไหน จากนั้นตาราง MyISAM ของคุณจะถูกอ่าน / เขียนจากที่ใดก็ได้ตั้งแต่ 20% - 30% เร็วขึ้นโดยไม่ต้องเปลี่ยนอะไรเลย

ผมได้เรียนรู้ว่าจากหน้า 72,73 จากฐานข้อมูล MySQL การออกแบบและปรับแต่ง

ฉันเคยเขียนเกี่ยวกับเรื่องนี้ในอดีต:


ขอบคุณสำหรับคำอธิบายรายละเอียดใช่ดัชนีที่เพิ่มลงในตารางจะขึ้นอยู่กับแบบสอบถามที่ใช้สำหรับการเลือกจัดกลุ่มตามและเรียงตามคำสั่งที่ใช้ในระบบของเรา ได้รับการตรวจสอบแบบสอบถามโดยไม่ต้องบันทึกดัชนีและได้รับการปรับปรุงตารางตาม
ดอน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.