Tôi là một lập trình viên, không phải là một DBA. Hãy nhẹ nhàng :)
Tổng quat
- InnoDB, MySQL
- kịch bản mod_perl, kết nối liên tục
- kịch bản được gọi cứ sau 20 giây bởi hàng ngàn người dùng
Vấn đề
- High Disk IO (có lẽ là do cập nhật [?]) Làm chậm mọi thứ, tạo ra một nút cổ chai lớn.
Truy vấn
- CẬP NHẬT [bảng đơn] SET refreshTime vào dấu thời gian hiện tại, với hai lần kiểm tra cùng bảng trong mệnh đề WHERE
- CHỌN COUNT (*) [tham gia bốn bảng, với các chỉ mục] và một loạt các AND trong mệnh đề WHERE (vẫn khá đơn giản)
- CHỌN a, b [nối bốn bảng, cùng bốn bảng] và một bó AND trong mệnh đề WHERE (cũng khá đơn giản)
Bộ nhớ cache truy vấn được bật.
Các giải pháp?
- Tôi không phải là một DBA, nhưng tôi nghi ngờ rằng có thể có một bảng trong RAM định kỳ (cứ sau 10 giây?) Cập nhật vào đĩa và trong trường hợp xảy ra lỗi nghiêm trọng, sẽ tự động điền vào bảng RAM từ bảng đĩa khi khởi động lại, nhưng tôi không biết liệu nó có thực sự khả thi hay không, nếu đó là giải pháp tốt nhất hoặc có những lựa chọn nào khác ngoài đó.
- Bất kỳ suy nghĩ hoặc đề nghị? Một lần nữa, tôi là một lập trình viên nên nếu ai đó biết ai đó làm việc này với một khoản phí hoặc có thể chỉ cho tôi các tài nguyên rất cụ thể, tôi sẽ rất cảm kích.
~~~~~~~
CREATE TABLE `openInvitations` (
`id` int(99) NOT NULL auto_increment,
`createTime` timestamp NULL default NULL,
`repAcceptTime` timestamp NULL default NULL,
`rep_id` varchar(64) NOT NULL default '',
`repRefreshTime` timestamp NULL default NULL,
`customer_macAddr` varchar(14) NOT NULL default '',
`customerRefreshTime` timestamp NULL default NULL,
`stage` char(1) NOT NULL default 'P',
`parent` varchar(25) default NULL,
`reason` varchar(64) default NULL,
PRIMARY KEY (`rep_id`,`customer_macAddr`),
UNIQUE KEY `id` (`id`),
KEY `customer_macAddr` (`customer_macAddr`),
CONSTRAINT `openInvitations_ibfk_1` FOREIGN KEY (`rep_id`) REFERENCES `rep` (`id`),
CONSTRAINT `openInvitations_ibfk_2` FOREIGN KEY (`customer_macAddr`) REFERENCES `customer` (`macAddr`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=latin1
id select_type loại bảng có thể_key key key_len ref rows Extra 1 SIMPLE oi ref PRIMARY, customer_macAddr customer_macAddr 16 const 1 Sử dụng ở đâu; Sử dụng chỉ mục 1 SIMPLE r eq numf PRIMARY, FK nump_1 PRIMary 66 xxx.oi.rep_id 1 Sử dụng ở đâu 1 SIMPLE s eq numf PRIMARY, FK_subscacker_1 PRIMARY 27 xxx.r.subscacker_id 1 Sử dụng ở đâu 1 SIMPLE c eq numf PRIMary PRIMary 4 xxx.s.charge_id 1 Sử dụng ở đâu
id select_type loại bảng có thể_key key key_len ref rows Extra 1 SIMPLE oi ref PRIMARY, customer_macAddr customer_macAddr 16 const 1 Sử dụng ở đâu 1 SIMPLE r eq numf PRIMARY, FK nump_1 PRIMary 66 xxx.oi.rep_id 1 Sử dụng ở đâu 1 SIMPLE s eq numf PRIMARY, FK_subscacker_1 PRIMARY 27 xxx.r.subscacker_id 1 Sử dụng ở đâu 1 SIMPLE c eq numf PRIMary PRIMary 4 xxx.s.charge_id 1 Sử dụng ở đâu
id select_type loại bảng có thể_key key key_len ref rows Extra 1 SIMPLE openInvitations TẤT CẢ khách hàng_macAddr NULL NULL NULL 5258 Sử dụng ở đâu
Sau khi sửa truy vấn:
id select_type loại bảng có thể_key key key_len ref rows Extra 1 SIMPLE openInvitations ref customer_macAddr customer_macAddr 16 const 1 Sử dụng ở đâu
EXPLAIN
đầu ra cho các truy vấn đã chọn của bạn vàSHOW CREATE TABLE updateTable
để chúng tôi trợ giúp. Đây có lẽ là một vấn đề lập chỉ mục.