使用mysql慢速左连接

时间:2012-11-20 19:56:24

标签: mysql sql query-optimization

以下是有问题的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 |
+----+-------------+-------+---+------+---------------+------+---------+------+------+--------------------------------+

3 个答案:

答案 0 :(得分: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始终为null,而NULL LIKE 'Something%'永远不会为真。

答案 1 :(得分:1)

提高速度的一种方法是从连接条件中删除LIKE CONCAT()

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

答案 2 :(得分: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) ;