Tôi hiện đang cố gắng chạy một số truy vấn đối với kết xuất dữ liệu của các bình luận của Stack Overflow. Đây là lược đồ trông như thế nào:
CREATE TABLE `socomments` (
`Id` int(11) NOT NULL,
`PostId` int(11) NOT NULL,
`Score` int(11) DEFAULT NULL,
`Text` varchar(600) NOT NULL,
`CreationDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`UserId` int(11) NOT NULL,
PRIMARY KEY (`Id`),
KEY `idx_socomments_PostId` (`PostId`),
KEY `CreationDate` (`CreationDate`),
FULLTEXT KEY `Text` (`Text`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
Tôi đã chạy truy vấn này trên bảng và nó chạy rất chậm (Nó có 29 triệu hàng, nhưng nó có chỉ mục Toàn văn):
SELECT *
FROM socomments
WHERE MATCH (Text) AGAINST ('"fixed the post"' IN BOOLEAN MODE)
Vì vậy, tôi đã mô tả nó, kết quả của nó là:
|| Status || Duration ||
|| starting || 0.000058 ||
|| checking permissions || 0.000006 ||
|| Opening tables || 0.000014 ||
|| init || 0.000019 ||
|| System lock || 0.000006 ||
|| optimizing || 0.000007 ||
|| statistics || 0.000013 ||
|| preparing || 0.000005 ||
|| FULLTEXT initialization || 207.1112 ||
|| executing || 0.000009 ||
|| Sending data || 0.000856 ||
|| end || 0.000004 ||
|| query end || 0.000004 ||
|| closing tables || 0.000006 ||
|| freeing items || 0.000059 ||
|| logging slow query || 0.000037 ||
|| cleaning up || 0.000046 ||
Như bạn có thể thấy, nó dành một thời gian dài để khởi tạo FULLTEXT. Điều này có bình thường không? Nếu không, tôi sẽ sửa nó như thế nào?
id_group 2
vàid_group 23
. Với điều này, tìm kiếm của bạn bên trong bảng chính của bạn và giới hạn truy vấn của bạn trong phạm vi id từ 2.000 đến 2.999 và 23.000 đến 23.999. Tất nhiên lần thứ 2 sẽ mang lại nhiều kết quả hơn khi bạn cần kết hợp tất cả các bình luận tạo ra các kết hợp từ khóa mới, nhưng cuối cùng nó sẽ tăng tốc toàn bộ. Tất nhiên nó tăng gấp đôi không gian sử dụng đĩa. Nhận xét mới nên được CONCAT'ed vào bảng nhóm.