我的sql查询一直在抓取,是代码还是其他什么?

时间:2018-03-20 09:55:41

标签: mysql sql sql-server

我尝试通过以下代码连接三个表:

SELECT *
FROM tickets t
JOIN evenementen e
   ON e.idEvenement = t.fk_tiEvenementID
JOIN klanttyperesult k
   ON k.kltr_idKlant = t.fk_tiKlantID;

代码是否存在问题,或者我应该在其他地方查找问题?

1 个答案:

答案 0 :(得分:1)

通过"继续抓取"我认为你的意思是挂起,你很可能会选择批次的数据。要分解你的查询正在做什么,以及为什么需要花费很长时间:

SELECT * - 从此查询引用的每个表中选择每一列。这意味着您将返回大量数据,如果每个表有7列,您将返回21列数据。

FROM tickets t - 来自tickets的别名t

JOIN evenementen e - 使用别名evenementen加入表格e,过滤掉表格之间没有连接条件的结果。

ON e.idEvenement = t.fk_tiEvenementID - 根据给定的条件

JOIN klanttyperesult k - 使用别名klanttyperesult加入表格k,过滤掉表格之间没有连接条件的结果。

ON k.kltr_idKlant = t.fk_tiKlantID; - 根据给定的条件。

如果这些表格有很多行,那么您很快就会进入昂贵的连接区域。

您也可能缺少索引,这意味着您正在使用嵌套循环连接(对于大型数据集可能效率低,请参阅https://dev.mysql.com/doc/refman/5.7/en/nested-loop-joins.html)。尝试在表格中添加一些索引,例如this

CREATE INDEX tickets_evenementenIdIdx ON tickets (fk_tiEvenementID)

CREATE INDEX tickets_klanttyperesultIdIdx ON tickets (fk_tiKlantID)

CREATE INDEX evenementen_ticketsIdIdx ON evenementen (idEvenement)

CREATE INDEX klanttyperesultIdIdx ON klanttyperesult (kltr_idKlant)