2017-10-13 3 views
0

私はこれに「なぜ」を探していました。 このクエリでは、結果を表示しようとしていますが、以前は、あるテーブルのURLフィールドと別のテーブルのURLフィールドを比較しています(CONCATはURLが全く同じではないため使用します)。 "Order by ..."このステートメントは、サーバーが接続を切断するまで応答するのに時間がかかります。Mysql - 「注文」は「CONCAT」を使用して動作しません

SELECT id, url, title MATCH(title, tags, category) AGAINST('white dogs') as score 
FROM Items 
LEFT JOIN Deleted_Items 
ON Deleted_Items.url LIKE CONCAT(Items.url , '%') 
WHERE Deleted_Items.url IS NULL 
AND MATCH(title, tags, category) AGAINST('white dogs' IN BOOLEAN MODE) 
ORDER BY score DESC 
LIMIT 30 
+0

選択したテーブルを参照する必要があります。それ以外の場合は重複して解釈され、タイムアウトするまで永久に検索されます。 –

+0

テーブルの名前を各列に追加してテストを行いましたが、結果は同じでした。 *) – Kokox

答えて

1

CONCATを(使用する結合条件は)sargableではなく、したがって、本質的に非効率的なプラス計算にソート。おそらく、一時的なテーブルにデータを永続させることによってそれを助けてください。

INSERT INTO some_temp_tbl_name (id, url, title, tags, category) 
SELECT i.id, i.url, i.title, i.tags, i.category 
FROM Items i 
LEFT JOIN Deleted_Items d ON d.url LIKE CONCAT(i.url , '%') 
WHERE d.url IS NULL 

次に、そのテーブルから一致と順序を実行します。

関連する問題