0
SELECT 
  a.idmotcle,
  a.motcle, 
  count(DISTINCT c.id) as 'Programs',
  count(DISTINCT d.id) as 'Searches',
  FORMAT(count(DISTINCT d.id)/count(DISTINCT c.id),2) as 'S/P'

FROM motcle a
INNER JOIN motcle b 
     ON b.idmotcle=a.idmotcle AND a.archive=0
LEFT JOIN masters_keywords_nton c 
     ON c.id_motcle=a.idmotcle
LEFT JOIN master_search_log_tbl d 
     ON d.search_string LIKE concat('%',a.motcle,'%')
GROUP BY a.idmotcle
ORDER BY a.motcle

テーブル - 総レコード数

斑点 - 200

masters_keywrods_nton - 1300

master_search_log_tbl - 4800

ON 句で使用されるすべてのフィールドにインデックスが既にあります。

クエリを本番環境で実行すると、現在 62.887 秒かかります。

結合とカウントを行うためのより良い方法があると思いますか?

4

1 に答える 1

0

クエリの最適化についてサポートが必要な場合は、クエリのEXPLAINプランとCREATEテーブルステートメントを提供してください。

クエリが何をするかを知ることも重要です-クエリ内の各フレーズ/式の説明を提供する必要があります。

なぜあなたは同じ分野でmotcleをそれ自体に参加させているのですか?なぜ左結合を使用しているのですか?null値を一致としてカウントするのはなぜですか?

大まかな推測では、これはあなたが必要とするものをあなたに与えるかもしれないと私は思う:

SELECT 
  a.idmotcle,
  a.motcle, 
  count(DISTINCT c.id) as 'Programs',
  count(DISTINCT d.id) as 'Searches',
  FORMAT(count(DISTINCT d.id)/count(DISTINCT c.id),2) as 'S/P'
FROM motcle a
INNER JOIN masters_keywords_nton c 
 ON c.id_motcle=a.idmotcle
INNER JOIN master_search_log_tbl d 
 ON d.search_string LIKE concat('%',a.motcle,'%')
WHERE a.archive=0
GROUP BY a.idmotcle
ORDER BY a.motcle

しかし、ここでの明白なWTFは、データが正規化されていないことです(d.search_string LIKE concat('%'、a.motcle、'%'))-これを修正すると、パフォーマンスが最大に向上し、潜在的な機能上のバグが修正されます。コード。(フルテキストインデックスを使用すると、一時的な猶予が提供される場合があります)。

于 2013-02-15T12:29:14.183 に答える