指尖上的码农 2021-01-31 12:15 采纳率: 100%
浏览 38
已结题

mysql 相关子查询 索引失效

select * from t0_index i left join t0_index_listed_company ilc on i.id = ilc.index_id where i.ts_code = 'BK0057' and
    (select sd.pct_chg from t0_share_data sd where sd.ts_code = concat(right(ilc.ts_code, 6), '.', left(ilc.ts_code, 2)) order by sd.add_time desc limit 1) > 9.9;

explain结果是

1,PRIMARY,i,,ALL,,,,,42,10,Using where
1,PRIMARY,ilc,,ALL,,,,,4048,100,Using where; Using join buffer (Block Nested Loop)
2,DEPENDENT SUBQUERY,sd,,ALL,index_tscode_addtime,,,,3946875,10,Using where; Using filesort

t0_share_data表400万条数据,有一个索引是ndex_tscode_addtime,就是tscode以及addtime建立的

刚开始以为是使用了cocat,或者right,left所导致的索引失效,遂改成:

select * from t0_index i left join t0_index_listed_company ilc on i.id = ilc.index_id where i.ts_code = 'BK0057' and
        (select sd.pct_chg from t0_share_data sd where sd.ts_code = ilc.ts_code order by sd.add_time desc limit 1) > 9.9;

子查询where去除了函数

当然改完后的sql肯定是不正确的,只是为了确认是不是因为使用函数的原因,但是explain结果:

1,PRIMARY,i,,ALL,,,,,42,10,Using where
1,PRIMARY,ilc,,ALL,,,,,4048,100,Using where; Using join buffer (Block Nested Loop)
2,DEPENDENT SUBQUERY,sd,,ALL,index_tscode_addtime,,,,3946875,10,Using where; Using filesort
 

依旧是没有起作用。。

想请教为什么子查询没有使用索引?

  • 写回答

2条回答 默认 最新

  • 指尖上的码农 2021-06-08 10:08
    关注

    移除子查询中的 order by 然后将索引建立成按照add_time 排序 可以使用索引,并且不会排序,原因未知

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

报告相同问题?

问题事件

  • 系统已结题 11月18日
  • 已采纳回答 11月10日

悬赏问题

  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境
  • ¥30 关于#java#的问题,请各位专家解答!
  • ¥30 vue+element根据数据循环生成多个table,如何实现最后一列 平均分合并
  • ¥20 pcf8563时钟芯片不启振