2016-04-15 138 views
0

我的代码INNER JOIN太慢。它如何能够更快地蜂

SELECT * FROM andmed3 INNER JOIN test ON andmed3.isik like concat('%', test.isik, '%') 

在andmed3我有13万行和测试我有10000行,它不会运行。 当我将其限制为0,500时,它将查询约2-3分钟。

它怎么会更好?

andmed3表

id name number isik link stat else 
----------------------------------------------- 
1 john 15  1233213 none 11  5 
        8455666 
        7884555 

测试表

id isik 
----------- 
45 8455666 

所以我需要所有从哪里是数什么测试occures

+8

您的连接基于'非可萨斯条件'LIKE'%...%''。为了加快速度,你应该重新考虑连接(可能会添加人工键)或使用FULL-TEXT索引。 – lad2025

+0

这似乎是由于不良的架构设计....你可能会显示两个表的示例输出以及架构... –

+0

什么是和andmed3和测试 –

回答

0

的问题是发动机生病需要将andmed3行评估连接中每对行的表达式(130.000 X 10.000)的LIKE表达式。 在这种情况下,索引也没用,因为表达式需要进行评估才能完成连接(并且不能将该表达式放入索引中)

也许这是您的架构/架构问题。当没有人需要根据字符串表达式来连接两个表时。

可能的解决办法:

(这是一个疯狂的猜测)

很难说肯定从你的例子,但如果andmed3.isik包含在连接中使用所有可能的值,你可以尝试把该在另一个表像它:

Andmed3Id isik 
--------- ------- 
     1 1233213 
     1 8455666 
     1 7884555 

过程来填充这个表你生病需要一个战略,possbile的是:在插入/更新,在有些晚了一批。

如果适合您,只需在查询中添加一个连接。