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