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%'永远不可能为 true。

于 2012-11-20T20:02:55.980 回答
1

加快此速度的一种方法是LIKE CONCAT()从连接条件中删除 。

MySQL 无法使用索引进行基于子字符串的搜索,因此您的查询会导致全表扫描。

于 2012-11-20T20:03:17.017 回答
0

EXPLAIN表明您没有可以使用的索引。

两个表上的适当索引会有所帮助。单个索引(manufacturer)或复合索引(manufacturer, model)

ALTER TABLE company1
  ADD INDEX manufacturer_model_IDX       --- this is just a name (of your choice)
    (manufacturer, model) ;              --- for the index

ALTER TABLE company2
  ADD INDEX manufacturer_model_IDX
    (manufacturer, model) ;
于 2012-11-20T20:14:14.623 回答