2012-11-20 106 views
0

這裏是SQL查詢:慢左連接問題用mysql

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

公司1包含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 | 
+----+-------------+-------+---+------+---------------+------+---------+------+------+--------------------------------+ 
+1

您可以發佈EXPLAIN的結果呢?可能做一個沒有索引的搜索。 – AllInOne

+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總是nullNULL LIKE 'Something%'永遠不會成立。

+0

這應該是快很多,因爲兩個表的製造商也被索引。 – Kaii

+0

這工作完美!謝謝 –

1

提高速度的一種方法是從連接條件中刪除LIKE CONCAT()

MySQL無法像這樣使用基於子串的搜索的索引,因此您的查詢會導致全表掃描。

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) ;