130 万を超えるレコードのデータベースがあります。これらの各レコードには、placeid と catid が一致する 1 つ以上の行を保持するカテゴリ マッチ テーブルを使用して、1 つ以上のカテゴリ (またはタグ) が関連付けられています。全文検索を使用して、場所名および/または fullloc (完全な場所) フィールドで一致を見つけています。
以下のクエリでわかるように、「内部結合」と「グループ化」を使用してカテゴリの一致を処理しています。場所を関連付けることができるカテゴリは 40 近くあります。130 万件のレコードを検索すると、これは非常に遅くなります。
SELECT
MATCH(placename,fullloc) AGAINST ('chappaqua school' IN BOOLEAN MODE)
as score,
places.PlaceName, places.fullloc, places.PlaceID, places.ImageThumb,
places.contributorid, places.verified, places.verified_by,
places.verified_date, places.visibility
FROM places
WHERE STATUS IN (1,0)
AND MATCH(placename,fullloc) AGAINST ('chappaqua school' IN BOOLEAN MODE)
AND places_cats.CATID IN (129,75,104,126,115,140,128,137,136,114,135,
105,142,141,90,121,122,117,98,1,130,127,25,116,102,5,
88,87,31,24,37,134,39,40,112,34,30,133,9,8,7,11,20,19,
3,2,4,131,132,89,38,125,139,36,124,138,35,119,118,120,
96,97,95,13,17,14,12,21,15,32,16,26,29,28,27,85,86,84)
AND (visibility = 1 )
GROUP BY PlaceID
ORDER BY score DESC LIMIT 500
カテゴリを処理する新しい方法を見つけるための助けを探しています。Places テーブルに CatID を格納する方法はありますか?
上記のクエリの EXPLAIN は次のとおりです....
1,SIMPLE,places,fulltext,"PRIMARY,by_plaeid,by_full_text",by_full_text,0,,1,Using where; Using temporary; Using filesort
1,SIMPLE,places_cats,ref,"by_PlaceIDandCatID,by_catid,by_catID_and_placeID,by_placeid",by_placeid,4,mapthepast.places.PlaceID,1,Using where
上記のクエリには、現在 10.8 秒かかります。カテゴリ JOIN (下記) を削除すると、実行時間は 2.08 に低下します。
SELECT MATCH(placename,fullloc) AGAINST ('chappaqua school' IN BOOLEAN MODE) as score,
places.PlaceName, places.fullloc, places.PlaceID, places.ImageThumb, places.contributorid, places.verified, places.verified_by, places.verified_date, places.visibility
FROM places
WHERE STATUS IN (1,0) AND MATCH(placename,fullloc) AGAINST ('chappaqua school' IN BOOLEAN MODE)
GROUP BY PlaceID
ORDER BY score DESC LIMIT 500