php Mysql查询非常慢时,选择从2表

bqujaahr  于 2023-08-02  发布在  PHP
关注(0)|答案(2)|浏览(101)

我正在尝试用MySQL执行一个非常简单的查询。我试图实现的是在1个查询中从2个不同的表中选择一些数据。但是,如果我只从一个表中选择数据,查询运行得很快,但是当我切换到从两个表中选择数据时,它会变得非常慢。
我想实现的查询看起来像这样:

SELECT k.klantId, b.bestelId
FROM klanten k, bestellingen b
WHERE k.klantId=b.klantId AND voornaam LIKE '%henk%'

字符串
上面的查询运行大约需要20秒。
但是当我像这样执行查询时,查询只运行了不到一秒:

SELECT k.klantId
FROM klanten k, bestellingen b
WHERE k.klantId=b.klantId AND voornaam LIKE '%henk%'


我还尝试从表'bestellingen'中选择一个不同的列,但这也非常慢。
有没有人知道为什么选择一个额外的字段会这么慢?
--编辑--
我以为我在那里,但现在我正在用更多的列来选择我的表。现在又花了18秒,但也许我的扩展查询做错了什么。有谁知道这有什么问题吗?

SELECT filiaalId, bestelId, k.klantId, totaalPrijs, b.statusId, b.tmInvoer, geprint, verzendwijze, betaalwijze, afhaalpuntId, verzendkosten, betaalwijzeKosten 
FROM klanten k LEFT JOIN bestellingen b ON (k.klantId=b.klantId) 
WHERE (k.voornaam LIKE '%henk%' OR k.achternaam LIKE '%henk%' OR b.bestelId LIKE '%henk%') 
ORDER BY b.tmInvoer DESC

m528fe3b

m528fe3b1#

尝试使用mysql连接,这应该更快。

SELECT k.klantId, b.bestelId
FROM klanten k LEFT JOIN bestellingen b ON (k.klantId=b.klantId)
WHERE voornaam LIKE '%henk%'

字符串
您还可以确保两个列k.klantIdb.bestelId已被索引。

l0oc07j2

l0oc07j22#

我知道这是非常晚了你的问题,大约7年,但别人肯定会有这个问题。解决办法很简单。
一旦你“喜欢”,特别是与野生“%”从一个以上的表,你得到一个巨大的缓慢。将“LEFT JOIN”更改为“INNER JOIN”立即解决了这个问题,18秒将增加到0.2秒,但是,如果任何一个表都有另一个表没有的记录,您将错过该结果。
为了保持“左”和移动 lightning 般的速度,你必须减少到一个“喜欢”通过CONCAT。
我的查询是19秒,现在是0.03
更改您的

FROM klanten k LEFT JOIN bestellingen b ON (k.klantId=b.klantId)  
WHERE (k.voornaam LIKE '%henk%' OR k.achternaam LIKE '%henk%' OR b.bestelId LIKE '%henk%')

字符串
TO

FROM klanten k LEFT JOIN bestellingen b ON (k.klantId=b.klantId)  
WHERE CONCAT(k.voornaam,' ',k.achternaam,' ',b.bestelId,' ') LIKE '%henk%'


你现在回到运行ONE like,而不是每次在每个表中查找它,concat给它一个项目来检查。只有当您在所有表中寻找相同的“like”时,这才有效。

相关问题