我有一个 MySQL 数据库和一个 MS Access 前端。 MySQL 数据库表通过 ODBC 连接链接到 MS Access。
如果“WHERE”(或“HAVING”)子句中有任何内容,任何具有多个连接表的查询都会运行得非常慢。
例如:
SELECT tblGuests.GuestName, Sum(tblPayments.Payment) AS SumOfPayment, tblRooms.RoomName
FROM (tblGuests LEFT JOIN tblPayments ON tblGuests.GuestID = tblPayments.GuestNo) LEFT JOIN tblRooms ON tblGuests.RoomNo = tblRooms.RoomID
WHERE tblGuests.NoShow=False
GROUP BY tblGuests.GuestName, tblRooms.RoomName;
将花费很长时间(20K 记录大约需要 3 分钟)。在传递查询的情况下,完全相同的脚本需要 1-1.5 秒,因此问题不应该与服务器端的索引或设置有关。 (顺便说一句,索引是在必要的列上设置的,并且也设置了关系。)
仅当查询中涉及 2 个以上的表并且“WHERE”子句或“HAVING”中有某些内容时,才会出现此问题。
例如,如果您将上面的代码修改为
SELECT tblGuests.GuestName, Sum(tblPayments.Payment) AS SumOfPayment
FROM tblGuests LEFT JOIN tblPayments ON tblGuests.GuestID = tblPayments.GuestNo
WHERE tblGuests.NoShow=False
GROUP BY tblGuests.GuestName;
然后又会很快。 (查询只涉及2个表。)另外
SELECT tblGuests.GuestName, Sum(tblPayments.HUFpayment) AS SumOfPayment, tblGuests.NoShow, tblRooms.RoomName
FROM (tblGuests LEFT JOIN tblPayments ON tblGuests.GuestID = tblPayments.GuestNo) LEFT JOIN tblRooms ON tblGuests.RoomNo = tblRooms.RoomID
GROUP BY tblGuests.GuestName, tblGuests.NoShow, tblRooms.RoomName;
不会有任何问题,因为没有“WHERE”子句。然而,我在文章开头提到的非常相似的代码将非常慢,除非我直接在服务器上运行它(或通过传递查询)。
您是否知道什么会导致此问题以及如何避免它(除了始终运行传递查询)?