Ich versuche derzeit, einige Abfragen für einen Daten-Dump der Kommentare von Stack Overflow auszuführen. So sieht das Schema aus:
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
Ich habe diese Abfrage für die Tabelle ausgeführt und sie ist unglaublich langsam (29 Millionen Zeilen, aber ein Volltextindex):
SELECT *
FROM socomments
WHERE MATCH (Text) AGAINST ('"fixed the post"' IN BOOLEAN MODE)
Also habe ich es profiliert. Die Ergebnisse sind:
|| 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 ||
Wie Sie sehen, dauert die FULLTEXT-Initialisierung sehr lange. Ist das normal? Wenn nicht, wie würde ich das beheben?
id_group 2
undid_group 23
. Mit dieser Option durchsuchen Sie Ihre Haupttabelle und begrenzen Ihre Abfrage auf die ID-Bereiche 2.000 bis 2.999 und 23.000 bis 23.999. Natürlich führt die zweite zu mehr Ergebnissen, wenn Sie alle Kommentare verwechseln und neue Schlüsselwortkombinationen erstellen, aber letztendlich sollte dies die ganze Sache beschleunigen. Natürlich verdoppelt es den Speicherplatzbedarf. Neue Kommentare sollten der Gruppentabelle hinzugefügt werden .