Tôi có một cơ sở dữ liệu duy nhất gồm khoảng 100 bảng để lưu trữ các loại thông tin khác nhau.
Bảng quan trọng nhất là bảng đơn hàng của chúng tôi được sử dụng để lưu trữ đơn đặt hàng của khách hàng và hiện có hơn 100000 hồ sơ.
Bảng này là bảng được yêu cầu nhiều nhất trong cơ sở dữ liệu của chúng tôi, cho các phần thông tin khác nhau cần thiết từ bảng điều khiển theo thứ tự thời gian thực, số liệu thống kê, phân tích, v.v.
Tôi theo dõi cơ sở dữ liệu một cách thường xuyên và có các truy vấn chậm được kích hoạt trên cơ sở dữ liệu để theo dõi các vấn đề.
Tôi sử dụng các tập lệnh như mysqltuner để đưa ra truy vấn hàng ngày.
Tôi cũng sử dụng mysqlsla để thu thập thông tin về 10 truy vấn chậm nhất trong cơ sở dữ liệu của chúng tôi.
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%)
Hầu hết các câu hỏi chậm nhất liên quan đến bảng thứ tự được đề cập ở trên. Tôi sử dụng MyISAM làm công cụ lưu trữ của mình để các vấn đề có thể xảy ra:
- Khóa bảng
- Vấn đề lập chỉ mục
Làm cách nào tôi có thể cải thiện các số liệu thống kê này, tôi đã lập chỉ mục cho các bảng này và đã tiếp tục điều chỉnh chúng để cải thiện các truy vấn đọc.
Lược đồ bảng
`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`)
truy vấn nhật ký chậm
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
và gửi câu hỏi đó trong câu hỏi