ขณะนี้ฉันกำลังพยายามเรียกใช้แบบสอบถามบางอย่างเทียบกับการถ่ายโอนข้อมูลของความคิดเห็นของ Stack Overflow นี่คือลักษณะของสคีมา:
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
ฉันเรียกใช้แบบสอบถามนี้กับตารางและมันทำงานช้าอย่างไม่น่าเชื่อ (มี 29 ล้านแถว แต่มีดัชนีข้อความแบบเต็ม):
SELECT *
FROM socomments
WHERE MATCH (Text) AGAINST ('"fixed the post"' IN BOOLEAN MODE)
ดังนั้นฉันจึงทำโปรไฟล์ผลลัพธ์คือ:
|| 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 ||
อย่างที่คุณเห็นมันใช้เวลานานในการเริ่มต้น FULLTEXT เป็นเรื่องปกติหรือไม่ ถ้าไม่ฉันจะแก้ไขได้อย่างไร
id_group 2
id_group 23
ด้วยการค้นหาของคุณในตารางหลักของคุณและ จำกัด การสืบค้นของคุณให้อยู่ในช่วง id 2.000 ถึง 2.999 และ 23.000 ถึง 23.999 แน่นอนว่าอันดับที่ 2 จะให้ผลลัพธ์มากกว่าที่คุณต้องการเมื่อคุณรวมความคิดเห็นทั้งหมดที่สร้างชุดค่าผสมของคำหลักใหม่ แต่ท้ายที่สุดแล้วควรเพิ่มความรวดเร็วให้กับทุกสิ่ง แน่นอนมันเพิ่มการใช้พื้นที่ดิสก์เป็นสองเท่า ความคิดเห็นใหม่ควรจะCONCAT'edไปที่ตารางกลุ่ม