0

問題のSQLクエリは次のとおりです。

select *  from company1 
left join company2 on company2.model 
    LIKE CONCAT(company1.model,'%') 
    where company1.manufacturer = company2.manufacturer

company1には2000行が含まれ、company2には9000行が含まれます。

クエリの完了には約25秒かかります。

company1.modelとcompany2.modelにインデックスを付けています。

どうすればこれをスピードアップできるか考えていますか?ありがとう!

+----+-------------+-----------+------+---------------+------+---------+------+------+--------------------------------+
| id | select_type | table     | type | possible_keys | key  | key_len | ref  | rows | Extra                          |
+----+-------------+-----------+------+---------------+------+---------+------+------+--------------------------------+
|  1 | SIMPLE      | company1  | ALL  | NULL          | NULL | NULL    | NULL | 2853 |                                |
|  1 | SIMPLE      | company2  | ALL  | NULL          | NULL | NULL    | NULL | 8986 | Using where; Using join buffer |
+----+-------------+-------+---+------+---------------+------+---------+------+------+--------------------------------+
4

3 に答える 3

2

このクエリは概念的にはあなたのものと同じではありませんが、このようなものが必要ですか? あなたと同じ結果が得られると確信しています:

select
  *
from
  company1 inner join company2
  on company1.manufacturer = company2.manufacturer
where
  company2.model LIKE CONCAT(company1.model,'%')

編集:私もあなたleft joinを削除し、inner join. 結合が成功しない場合は、company2.model常にtrue になることはnullありNULL LIKE 'Something%'ません。

于 2012-11-20T20:02:55.980 に答える
1

LIKE CONCAT()これを高速化する 1 つの方法は、結合条件からを削除することです。

MySQL はそのような部分文字列ベースの検索にインデックスを使用できないため、クエリは完全なテーブル スキャンになります。

于 2012-11-20T20:03:17.017 に答える