我重构了一个从另一家公司继承的应用程序的缓慢部分,以使用内部连接而不是子查询
WHERE id IN (SELECT id FROM ...)
Run Code Online (Sandbox Code Playgroud)
重构的查询运行速度提高了约100倍.(约50秒到约0.3)我预计会有所改善,但任何人都可以解释为什么它如此激烈?where子句中使用的列都已编入索引.SQL是否每行执行一次where子句中的查询?
更新 - 解释结果:
不同之处在于"where in in()"查询的第二部分 -
2 DEPENDENT SUBQUERY submission_tags ref st_tag_id st_tag_id 4 const 2966 Using where
Run Code Online (Sandbox Code Playgroud)
vs 1带连接的索引行:
SIMPLE s eq_ref PRIMARY PRIMARY 4 newsladder_production.st.submission_id 1 Using index
Run Code Online (Sandbox Code Playgroud) 我有 2 个 MySQL 表 A 和 B。
我只想从 B 中选择 A 中存在某个值的记录。
例子:
A 有列:aID、Name
B 有列:bID、aID、Name
我只想要 A 中存在 aID 的 B 中的记录。
非常感谢。
所以我试图在SQL中使用"LIKE",基本上是为了看一个玩家是否已经在一个团队中.这是我的代码:
$checkifonlytwo = "SELECT * FROM sg_turn_teams WHERE joinid = :joinid AND players LIKE '%:ownerid,%'";
$paramstwo = array(
":joinid" => $joinid,
":ownerid" => $_SESSION['user']['id']
);
try{
$stmttwo = $db->prepare($checkifonlytwo);
$resulttwo = $stmttwo->execute($paramstwo);
}
catch(PDOException $ex){
die("Failed to run query #2: " . $ex->getMessage());
}
Run Code Online (Sandbox Code Playgroud)
另外你可以看到我希望它是LIKE '%1,%'
例如,所以最后的逗号也是如此.
我的表结构看起来像这样.
编辑,玩家将会像没有名字的"1,2,3",因为用户可以更改他们的名字.图片有名字,但它应该是1,2,3
我在这里尝试了解决方案,但它不起作用.
我的桌子是这样的:
`Index` uid dept
...........................
1 001 dept1
2 001 dept2
3 001 dept3
4 002 dept2
5 002 dept3
6 002 dept4
7 003 dept1
8 003 dept5
9 004 dept1
10 004 dept6
Run Code Online (Sandbox Code Playgroud)
我想要检索具有特定的所有行dept
.也就是说,如果我想要检索dept1
,我想检索除uid = 002之外的所有行,因为dept1
uid = 002 没有.
即使使用索引,查询字符串也很慢:
SELECT id FROM table WHERE uid IN
(SELECT uid WHERE dept='dept1')
Run Code Online (Sandbox Code Playgroud)
我之前没有使用WHERE IN的版本如下:
首先使用dept = dept1检索所有uid.
然后对第一个查询中检索到的所有uid使用for循环.
对于在第一个查询中检索的少量(100)行,此方法非常快.但是,它似乎不是一个好的解决方案,因为它会产生大量的查询(每个查询都非常快).
我有两张桌子:customer
和mailing
:
+==========+ +=============+
| customer | | mailing |
+==========+ +=============+
| id | | id |
+----------+ +-------------+
| name | | customer_id |
+----------+ +-------------+
| mailing_id |
+-------------+
Run Code Online (Sandbox Code Playgroud)
每次我向客户发送邮件时,我都会在邮件表中添加一行邮件ID.一封邮件可以发送给多个客户.
我想要一个sql调用,返回所有尚未收到某个邮件的客户.如何 ?
我正在使用mysql