J'essaie actuellement d'exécuter des requêtes sur un vidage de données des commentaires de Stack Overflow. Voici à quoi ressemble le schéma:
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
J'ai exécuté cette requête sur la table, et elle a été incroyablement lente (elle contient 29 millions de lignes, mais elle a un index de texte intégral):
SELECT *
FROM socomments
WHERE MATCH (Text) AGAINST ('"fixed the post"' IN BOOLEAN MODE)
Je l'ai donc profilé, dont les résultats sont:
|| 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 ||
Comme vous pouvez le voir, il passe beaucoup de temps à l'initialisation FULLTEXT. Est-ce normal? Sinon, comment pourrais-je le réparer?
id_group 2
etid_group 23
. Avec cela, votre recherche à l'intérieur de votre table principale et limitez votre requête aux plages d'ID 2.000 à 2.999 et 23.000 à 23.999. Bien sûr, le 2e produira plus de résultats au fur et à mesure que vous mélangerez tous les commentaires en créant de nouvelles combinaisons de mots clés, mais finalement cela devrait accélérer le tout. Bien sûr, cela double l'utilisation de l'espace disque. De nouveaux commentaires devraient être CONCAT'és à la table de groupe.