我想上进啊 2025-05-20 11:58 采纳率: 80%
浏览 11
已结题

为什么Mysql外联查询不走索引

有个SQL查询

SELECT
    wm.id,
    wus.`name` AS minSkuUnitName
FROM
    wms_material wm
    LEFT JOIN wms_unit wus ON wus.id = wm.min_sku_unit_id 
WHERE
    wm.del_flag = 0 

img

id都是主键,wm.min_sku_unit_id 加上索引也不走索引,但是加上wus表的name加上索引就会走索引,这是为什么了,请帮忙解释下什么原因啊

  • 写回答

4条回答 默认 最新

  • 宝码香车 优质创作者: JavaScript技术领域 2025-05-20 12:10
    关注

    让【宝码香车】来帮你解答,本回答参考DeepSeek编写,并整理提供。

    如果还有疑问可以点击头像关注私信或评论。如果答案让您满意,请采纳、点赞、关注,非常感谢!

    MySQL外联查询不走索引问题分析

    根据您提供的情况,这是一个典型的MySQL外联查询索引失效问题。我来分析原因并提供解决方案。

    问题分析

    您的查询语句:

    SELECT
        wm.id,
        wus.`name` AS minSkuUnitName
    FROM
        wms_material wm
        LEFT JOIN wms_unit wus ON wus.id = wm.min_sku_unit_id 
    WHERE
        wm.del_flag = 0
    

    索引失效的可能原因

    1. 数据类型不匹配wm.min_sku_unit_idwus.id的数据类型不一致
    2. 索引选择性低min_sku_unit_id列的值分布不均匀或重复值过多
    3. 表大小差异:MySQL优化器认为全表扫描比使用索引更快
    4. 统计信息不准确:MySQL的统计信息没有及时更新

    解决方案

    1. 检查数据类型一致性

    确保连接字段的数据类型完全一致:

    -- 检查两表连接字段的数据类型
    SHOW COLUMNS FROM wms_material LIKE 'min_sku_unit_id';
    SHOW COLUMNS FROM wms_unit LIKE 'id';
    

    2. 强制使用索引

    可以尝试强制使用索引:

    SELECT
        wm.id,
        wus.`name` AS minSkuUnitName
    FROM
        wms_material wm FORCE INDEX (index_name)
        LEFT JOIN wms_unit wus FORCE INDEX (PRIMARY) ON wus.id = wm.min_sku_unit_id 
    WHERE
        wm.del_flag = 0
    

    3. 更新统计信息

    ANALYZE TABLE wms_material;
    ANALYZE TABLE wms_unit;
    

    4. 使用EXPLAIN分析

    EXPLAIN SELECT
        wm.id,
        wus.`name` AS minSkuUnitName
    FROM
        wms_material wm
        LEFT JOIN wms_unit wus ON wus.id = wm.min_sku_unit_id 
    WHERE
        wm.del_flag = 0;
    

    为什么给wus.name加索引会走索引

    当您给wus.name加索引后,MySQL优化器可能认为:

    1. 需要从wus表获取name字段
    2. 通过索引获取name比全表扫描更高效
    3. 因此选择了先通过主键关联,再通过索引获取name

    优化建议

    1. 确保连接字段数据类型一致
    2. wm.min_sku_unit_id创建合适的索引
    3. 考虑使用复合索引(如果查询条件更多)
    4. 定期更新表统计信息
    -- 创建索引示例
    ALTER TABLE wms_material ADD INDEX idx_min_sku_unit_id (min_sku_unit_id);
    

    希望这些分析能帮助您解决问题。如果仍有疑问,可以提供EXPLAIN的完整输出结果,我可以进一步分析。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 5月20日
  • 已采纳回答 5月20日
  • 创建了问题 5月20日