現在、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
このクエリをテーブルに対して実行し、信じられないほど低速で実行しました(2900万行ありますが、フルテキストインデックスがあります)。
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番目の結果がより多くなりますが、最終的には全体が高速化されるはずです。もちろん、ディスク容量の使用量は2倍になります。新しいコメントはグループテーブルにCONCATする必要があります。