gpt4 book ai didi

sql - 索引可用时进行全表扫描

转载 作者:行者123 更新时间:2023-11-30 23:40:02 33 4
gpt4 key购买 nike

我有许多具有类似连接集合的查询。出于某种原因,他们都在其中一个连接上遭受表扫描。

   SELECT S.shape_id, 
S.title,
G.grid_id,
CI.city_id,
CI.city_name,
CO.country_code,
CO.country,
U.user_id,
U.username,
GA.first_name,
GA.fb_id
FROM shape S
JOIN spots SP ON S.shape_id = SP.shape_id
JOIN grid G ON SP.grid_id = G.grid_id
JOIN city CI on G.city_id = CI.city_id
JOIN country CO ON CI.country_code = CO.country_code
JOIN user U on S.user_id = U.user_id
LEFT JOIN gamer GA ON U.user_id = GA.user_id
WHERE S.status > 0
AND U.user_id != 2579
ORDER BY S.views ASC
LIMIT 111, 1

表格扫描似乎总是在表格 'grid'/'G' 上。

这是“解释”

    ID - SELECT TYPE - TABLE - TYPE - POSS KEYS - KEY - KEY LEN - REF - ROWS - EXTRA    -----------------------------------------------------------------------------------    1 - SIMPLE - G - ALL - PRIMARY - null - null - null - 405 - Using temporary; Using filesort        1 - SIMPLE - CI - eq_ref - PRIMARY - PRIMARY - 3 - ft_game.G.city_id - 1         1 - SIMPLE - CO - eq_ref - PRIMARY - PRIMARY - 6 - ft_game.CI.country_code - 1         1 - SIMPLE - SP - ref - shape_id,grid_id - grid_id - 4 - ft_game.G.grid_id - 1 - Using where        1 - SIMPLE - S - eq_ref - PRIMARY,user_id - PRIMARY - 4 - ft_game.SP.shape_id - 1 - Using where        1 - SIMPLE - U - eq_ref - PRIMARY - PRIMARY - 3 - ft_game.S.user_id - 1         1 - SIMPLE - GA - eq_ref - PRIMARY - PRIMARY - 3 - ft_game.S.user_id - 1
  1. 我对解释的顺序感到困惑...为什么 G(网格)在前?
  2. 当我有一个键是 G.grid_id(主键)时,为什么在网格上进行表扫描。
  3. 为什么要创建临时表?

最佳答案

我不是 mysql 专家。另一方面,我认为 Oracle 的基线是相似的。基于它们:

全表扫描或索引扫描背后的主要驱动因素是选择性。列中的不同值越多,使用索引的可能性就越大。如果数据库预计将提取超过 10% 的行,它可能会使用全表扫描。

我假设 gridId 在网格表中是唯一的。所以选择性很高。但是您使用其他列 city_id。这意味着,即使您使用索引来获取 id,也需要表数据,因为附加列在那里。如果这意味着将提取超过 10% 的行,则不会使用索引。

有多种连接方法。基于join method ,存在不同的行为。

对于 hash joinnested loops驱动程序表是较小或最小的,或者具有最多选择性谓词的表。所以我想网格是你最小的 table 。由于您的 SQL 没有任何基于等价的条件(您有一个 > 和一个 !=),您不应该怀疑该数据库将使用最小的表作为驱动程序。

所以全表扫描的主要原因是你没有任何选择条件,数据库应该从全表扫描开始,它选择了网格。就这些。

关于sql - 索引可用时进行全表扫描,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4208092/

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