提问人:Ahmet Karakaya 提问时间:8/23/2023 最后编辑:BarmarAhmet Karakaya 更新时间:8/24/2023 访问量:75
摆脱 FULL Scan 内部查询 Mysql DB
Get Rid Of FULL Scan Inner Query Mysql DB
问:
我在 MYSQL 上运行 SQL 查询,我希望在一次尝试中访问该记录。
由于内部查询仅获取 1 行,因此可以在inactive_users_6months的主键索引user_id上访问此记录。
但引擎不知何故更喜欢 FUll Sann。我还使用了力指数,但没有解决完全扫描问题。
基本上,, 返回结果 but 。如果存在内部查询,它会以某种方式触发完全扫描。
您知道如何优化它吗?select * from inactive_users_6months user_id IN ('XX','YY')
explain select *
from inactive_users_6months
where user_id IN(
select jid
from tig_pubsub_subscriptions
where node_id=6433274);
select jid from tig_pubsub_subscriptions where node_id=6433274
explain select *
from inactive_users_6months A
LEFT JOIN tig_pubsub_subscriptions B ON A.user_id = B.jid
Where B.node_id=6433274;
explain select *
from inactive_users_6months A
INNER JOIN tig_pubsub_subscriptions B ON A.user_id = B.jid
Where B.node_id=6433274;
答:
0赞
Adrian Maxwell
#1
你试过使用EXISTS吗?(并且不使用“选择*”)
explain select t.id -- choose whatever is the pk of that table
from inactive_users_6months as t
where exists (
select null
from tig_pubsub_subscriptions as s
where s.node_id=6433274 --<< this might cause the full scan
and s.jid = t.user_id
)
如果这也会产生完全扫描,请在没有 s.node 过滤器的情况下尝试
explain select t.id
from inactive_users_6months as t
where exists (
select null
from tig_pubsub_subscriptions as s
where s.jid = t.user_id
)
如果 tig_pubsub_subscriptions.node_id 的可变性很高,则该列的索引可能有助于解决完整扫描问题;但是,如果变异性较低,优化者可能会认为进行全面扫描更容易。
附言可以以文本形式提供解释计划,那么我们这些无法在本网站上看到任何图像的人可以做出贡献,而不必跳过重重障碍。
+----+-------------+-------+------+---------------+------+---------+------+-----+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+-----+-------------+
| 1 | SIMPLE | user | ALL | NULL | NULL | NULL | NULL | 4 | Using where |
+----+-------------+-------+------+---------------+------+---------+------+-----+-------------+
请参阅网站帮助文章:如何提出好问题?,恳请您不要使用图像。
(为什么我看不到任何图片?因为图片网站被网络管理员屏蔽了,但可能的原因有很多,我不是唯一一个受到影响的人)
评论
0赞
Ahmet Karakaya
8/24/2023
存在不起作用
0赞
Adrian Maxwell
8/24/2023
我认为它确实“有效”——但你的意思是它没有解决您的完整扫描问题。您是否在 上使用了索引?如果该索引没有帮助,那么也许是索引或相反的顺序。请注意,我们没有关于这些列中任何一个的基数的线索,因此您可能需要进行一些实验。tig_pubsub_subscriptions.node_id
node_id and jid
评论
JOIN
WHERE user_id IN
LEFT JOIN
INNER JOIN
inactive_users_6months
user_id