摆脱 FULL Scan 内部查询 Mysql DB

Get Rid Of FULL Scan Inner Query Mysql DB

提问人:Ahmet Karakaya 提问时间:8/23/2023 最后编辑:BarmarAhmet Karakaya 更新时间:8/24/2023 访问量:75

问:

我在 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);

enter image description here

解释inactive_users_6months; enter image description here

解释tig_pubsub_subscriptions enter image description here

select jid from tig_pubsub_subscriptions where node_id=6433274

enter image description here

explain select * 
from inactive_users_6months A 
LEFT JOIN tig_pubsub_subscriptions B ON  A.user_id = B.jid
Where B.node_id=6433274;

enter image description here

explain select * 
from inactive_users_6months A 
INNER JOIN tig_pubsub_subscriptions B ON  A.user_id = B.jid
Where B.node_id=6433274;

enter image description here

jquery mysql 数据库

评论

0赞 Barmar 8/23/2023
用代替JOINWHERE user_id IN
0赞 Ahmet Karakaya 8/23/2023
JOIN查询也给出了完全扫描,请查看上面更新的问题
0赞 Thallius 8/23/2023
我不明白你的问题。当然,MySQL正在搜索整个非活动用户表,因为它没有索引
0赞 Barmar 8/23/2023
不要使用什么时候会起作用。LEFT JOININNER JOIN
0赞 Barmar 8/23/2023
@Thallius 的主键 = 。inactive_users_6monthsuser_id

答:

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_idnode_id and jid