努力学Java的新人 2024-02-23 14:56 采纳率: 100%
浏览 6
已结题

关于Mysql内连接不走索引的问题

例如下文:

select * from test_one a
left join test_two b on a.id = SUBSTR(b.newid,1,7) 

这种SQL的查询语句很慢,请问这种方式有什么办法走索引或其他方式加快sql运行速度吗?

  • 写回答

4条回答 默认 最新

  • 桂圆肉肉 2024-02-23 15:03
    关注

    在SQL查询中,当使用函数(如 SUBSTR)来处理连接条件中的字段时,这通常会导致索引失效,因为数据库通常不能有效地使用索引来查找被函数处理过的数据。在你提供的查询中,SUBSTR(b.newid,1,7) 使得 test_two 表的 newid 字段上的任何索引都无法被利用,这可能导致查询性能下降。

    要优化这种查询,可以考虑创建计算列索引:

    在 test_two 表上创建一个新的计算列,该列存储 newid 字段的前7个字符。
    为这个新列创建索引。
    然后,可以在连接条件中使用这个新列,而不是使用 SUBSTR 函数。

    ALTER TABLE test_two ADD COLUMN newid_prefix VARCHAR(7);
    UPDATE test_two SET newid_prefix = SUBSTR(newid, 1, 7);
    CREATE INDEX idx_newid_prefix ON test_two(newid_prefix);
    
    -- 然后在查询中使用新列
    SELECT * FROM test_one a
    LEFT JOIN test_two b ON a.id = b.newid_prefix;
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 3月2日
  • 已采纳回答 2月23日
  • 创建了问题 2月23日

悬赏问题

  • ¥15 stc15f2k60s2单片机关于流水灯,时钟,定时器,矩阵键盘等方面的综合问题
  • ¥15 YOLOv8已有一个初步的检测模型,想利用这个模型对新的图片进行自动标注,生成labellmg可以识别的数据,再手动修改。如何操作?
  • ¥30 NIRfast软件使用指导
  • ¥20 matlab仿真问题,求功率谱密度
  • ¥15 求micropython modbus-RTU 从机的代码或库?
  • ¥15 django5安装失败
  • ¥15 Java与Hbase相关问题
  • ¥15 后缀 crn 游戏文件提取资源
  • ¥20 bash代码推送不上去 git fetch origin master #失败了
  • ¥15 LOL外服加入了反作弊系统,现在游戏录像rofl文件离线都无法打开