gpt4 book ai didi

mysql - 为 mySQL 优化 SQL 查询

转载 作者:行者123 更新时间:2023-11-29 02:33:16 25 4
gpt4 key购买 nike

我刚刚从 Access 更改为 mySQL。我有几个表,称为“Veranstaltung”和“Veranstaltung_User”。我想获取用户已订阅的所有事件 (=Veranstaltung),但用户正在查看的事件除外。

我用下面的语句做了这个

SELECT VID, Bezeichnung, Datum 
FROM tbl_Veranstaltung
WHERE year(Datum) = 2012
AND VID <> 613
AND VID IN (SELECT BewerbID
FROM Veranstaltung_User
WHERE UserID IN (SELECT UserID
FROM Veranstaltung_User
WHERE BewerbID = 613)
AND UserID <> 0)
ORDER BY Datum

在 Access 中,这个查询非常快 - 在 mySQL 中它需要 44,56 秒 - 太多了;-)

如何优化语句以加快查询速度? (mySQL > 5, 表件 MyISAM)

感谢帮助

最佳答案

两个变化:
1. 使用 JOIN 而不是嵌套的 IN 子句
2. 使用<= and >而不是 YEAR()功能

变化的优势1是有时 IN 性能可能比预期差,嵌套它们会加剧这种情况。

变化的优势2是它允许索引查找查找范围内的记录。 Where-as 使用 YEAR() 强制扫描整个表/索引。

两者都假设您有适当的索引。

SELECT
V.VID, V.Bezeichnung, V.Datum
FROM
tbl_Veranstaltung V
INNER JOIN
Veranstaltung_User VUser
ON VUser.BewerbID = V.VID
INNER JOIN
Veranstaltung_User VUser2
VUser.UserID = VUser2.UserID
WHERE
V.Datum >= '20120101'
AND V.Datum < '20130101'
AND V.VID <> 613
AND VUser.UserID <> 0
AND VUser2.BewerbID = 613
ORDER BY
Datum

关于mysql - 为 mySQL 优化 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9379183/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com