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

关于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 两台交换机分别是trunk接口和access接口为何无法通信,通信过程是如何?
  • ¥15 C语言使用vscode编码错误
  • ¥15 用KSV5转成本时,如何不生成那笔中间凭证
  • ¥20 ensp怎么配置让PC1和PC2通讯上
  • ¥50 有没有适合匹配类似图中的运动规律的图像处理算法
  • ¥15 dnat基础问题,本机发出,别人返回的包,不能命中
  • ¥15 请各位帮我看看是哪里出了问题
  • ¥15 vs2019的js智能提示
  • ¥15 关于#开发语言#的问题:FDTD建模问题图中代码没有报错,但是模型却变透明了
  • ¥15 uniapp的h5项目写一个抽奖动画