一个SQL优化的问题

心中自然无码 2018-06-04 05:34:17
select *
from T_CASE_FILE tcasefile0_ where 1=1 and tcasefile0_.ISDELETE=0 and tcasefile0_.FILESSSATUS='2'
and tcasefile0_.STAIR='98acd79f1a2b4c67959b14863cc7264e'
order by substring_index(tcasefile0_.FILENO, '-', 1) desc, substring_index(substring_index(substring_index(tcasefile0_.FILENO, '-', 2), '-', -1), '.', 1),
CONVERT(IFNULL(substring_index(substring_index(substring_index(tcasefile0_.FILENO, '-', 2), '-', -1), '.', -1), 0), SIGNED) asc,
CONVERT(IFNULL(SUBSTRING_INDEX(tcasefile0_.FILENO, '-', -1), 0), SIGNED) limit 30


这个是查询档案大节点的sql语句,不加上后面这个排序不到1秒,加上时间是11秒,大神有没有什么优化建议


这个是档号的排序,年份+全宗号+序号
...全文
1551 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
吉普赛的歌 2018-06-04
  • 打赏
  • 举报
回复
引用 2 楼 u010592876 的回复:
[quote=引用 1 楼 yenange 的回复:] 把排序内容弄成计算列, 计算列再加上索引就快了
请问mysql里计算列是个啥东西啊?菜鸟不懂。。。[/quote] 举个例子:
CREATE TABLE log_sync_plan_data(
	planLogId BIGINT PRIMARY KEY NOT NULL auto_increment,
	syncType int NOT NULL DEFAULT 0,
	tablesCnt int NOT NULL,
	finishedCnt int NOT NULL DEFAULT 0,
	beginTime datetime NOT NULL DEFAULT NOW(),
	endTime datetime NOT NULL DEFAULT '1900-01-01',
	elapsedSeconds INT generated always AS (case when endTime<beginTime then -1 ELSE timestampdiff(SECOND,endTime,beginTime) END) VIRTUAL,
	errMsg varchar(4000) NULL,
	success INT generated always AS( case when endTime<beginTime OR ifnull(errMsg,'')<>'' OR tablesCnt<>finishedCnt then 0 else 1 end) VIRTUAL
);
你把你的SQL改成跟我这个类似就可以了:
心中自然无码 2018-06-04
  • 打赏
  • 举报
回复
引用 1 楼 yenange 的回复:
把排序内容弄成计算列, 计算列再加上索引就快了
请问mysql里计算列是个啥东西啊?菜鸟不懂。。。
吉普赛的歌 2018-06-04
  • 打赏
  • 举报
回复
把排序内容弄成计算列, 计算列再加上索引就快了

22,300

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧