![]() |
1
14
查询应该是正常的。我将通过查询分析器运行它,并优化表上的索引。 |
![]() |
2
12
联接是可以对SQL查询执行的最昂贵的操作之一。虽然它应该能够在一定程度上自动优化您的查询,但是可以尝试重新构造它。首先,我将代替select*来指定您需要从哪个关系中选择哪些列。这会使事情加速很多。 如果您只需要用户ID,例如:
这将使SQL数据库能够更有效地自行重组查询。 |
![]() |
3
4
显然,我没有检查过这个问题,但似乎您要选择的是没有匹配的个人信息的任何订户,或者bios和shirtsizes之间的连接失败。我会考虑使用 NOT EXISTS 对于这种情况。您可能需要bio.user_id和shirtsizes.bio_id上的索引。
编辑 : 根据您的更新,您可能希望在每列上创建单独的键,而不是/除了具有复合主键之外。连接可能无法充分利用复合主索引,连接列上的索引本身可能会加快速度。 |
![]() |
4
1
是
有衬衫吗
|
![]() |
5
1
在相关季节的订户列表和有bios和衬衫尺寸的季节的订户列表之间做一个区别会更快吗?
这样可以避免外部连接,因为外部连接不如内部连接快,因此可能更快。另一方面,它可能正在创建两个大列表,它们之间的差异非常小。不清楚子查询中的distinct是否会提高或损害性能。它意味着一个排序操作(代价高昂),但如果mysql优化器支持这样的操作,则为合并联接铺平了道路。 可能还有其他符号可用-例如减号或差号。 |
![]() |
6
1
如果你定义了你要找的确切的东西而不是选择*它可能会加快一点…同样或不是要做的最快的查询,如果没有或可以重新编写它,则速度会更快。 也。。。你可以试试工会而不是左派? SELECT s.user_id FROM subscribers s LEFT JOIN bio b ON b.user_id = s.user_id LEFT JOIN shirtsizes ON shirtsize.bio_id = bio.bio_id WHERE s.season_id = 185181 AND (bio.bio_id IS NULL OR shirtsize.size IS NULL); 会是这样的: (SELECT s.user_id FROM subscribers s WHERE s.season_id = 185181) UNION (SELECT b.user_id, b.bio_id FROM bio b WHERE bio.bio_id IS NULL) UNION (SELECT shirtsizes.bio_id FROM shirtsizes WHERE shirtsizes.size is NULL)
(老实说,我觉得这不合适……但我从不使用
我会这样做: SELECT * FROM subscribers s, bio b, shirtsizes sh WHERE s.season_id = 185181 AND shirtsize.bio_id = bio.bio_id AND b.user_id = s.user_id AND (bio.bio_id IS NULL OR shirtsize.size IS NULL); |
![]() |
7
1
正如现在编写的那样,您的查询计算所有
但你想要的只是找到
所以你只想停止评估
这最多只能评估一个
应该工作得更快。 |
![]() |
8
0
|
![]() |
9
0
我假设您的“大表”是订户,而且那个季节的ID可能既不是选择性的,也不是索引的(如果它不是选择性的,索引就毫无意义了),这意味着无论如何,您必须完全扫描订户。分开时,我会(用一个内部连接)连接另外两个表-注意,如果衬衫尺寸中没有Bio_ID,您的查询与没有Bio完全相同。 第一位:
在这一点上,你要检查衬衫是否在Bio-ID上有索引。 现在,您可以将外部联接此查询保留到订阅服务器:
如果Bio和Shirtsizes都不是巨大的,那么它的运行速度可能相当快。 |
|
Johnny T · 基于当前值的SQL合并表[重复] 5 月前 |
![]() |
John D · 需要为NULL或NOT NULL的WHERE子句 5 月前 |
![]() |
ojek · 如何对SQL结果进行分组和编号? 5 月前 |
![]() |
senek · 如何在PL/SQL中将选择结果(列)放入数组中 5 月前 |
![]() |
Sax · 规范化Google表格(第一步) 5 月前 |
![]() |
Jatin · 检索卷计数的动态sql抛出错误语法错误[关闭] 5 月前 |
![]() |
Andrus · 如何在sql中查找第二个匹配项 5 月前 |