このクエリを最適化しようとしましたが、特定のビジネス要件のために実行できません。
テーブル:
b2
:約200万件、店舗業務記録business_reviews
: 小さな表、ビジネスのストア レビュー (各ビジネスには複数のレビューを含めることができます)business_feature_item
: 小さなテーブル、ビジネス向けのストア機能 (各ビジネスには複数の機能を含めることができます)
結果に対する特定のビジネス要件:
- 業務実績を表示
- 関連するビジネスのレビューも表示する
- 機能の検索も許可する
- b2.starbizとスコア(MATCH AGAINSTによって生成された)でソート
私の現在のクエリは一時テーブル、ユニオンオール、ソートを使用しているため、結果が大きい場合はうまく機能しません。このクエリを書き直して、より効率的に機能させる方法はありますか?
SELECT temp.* FROM
(SELECT DISTINCT b.business_id, b.description AS `extra`, '1' AS `type`, 0 as score
FROM b2 as b
LEFT JOIN business_feature_item AS i ON b.business_id = i.business_id
WHERE ((b.cat_id = '93' OR b.cat_id2 = '93' OR b.cat_id3 = '93'))
AND b.city_id = '152262'
AND `approved`=1
UNION ALL SELECT b.business_id, review_desc AS `extra`, '2' AS `type`, ((MATCH `review_desc` AGAINST ('"restaurants"' IN BOOLEAN MODE) * 4) + (MATCH `review_desc` AGAINST ('restaurants' IN BOOLEAN MODE) )) AS score
FROM b2 AS b, business_reviews AS r
WHERE b.business_id =r.business_id
AND b.city_id = '152262'
AND ( MATCH `review_desc` AGAINST ('"restaurants"' IN BOOLEAN MODE)
OR MATCH `review_desc` AGAINST ('restaurants' IN BOOLEAN MODE)))
AS temp
GROUP BY temp.business_id
ORDER BY starbiz DESC, score DESC