前景提要
关于sql优化的问题
0 悬赏园豆: 50 [待解决问题] 下面是某个视图中的sql语句 查询速度太过缓慢 所以想请大佬帮忙看一下有什么优化的办法
SELECT DISTINCT
Id ,
Number ,
Name ,
Time
FROM ( SELECT
Id ,
Number ,
Name ,
Time
FROM table_a a
WHERE Time = ( SELECT MAX(Time)
FROM table_a b
WHERE a.Id = b.Id
)
UNION ALL
SELECT
Id ,
Number ,
Name ,
Time
FROM table_b a
WHERE Time = ( SELECT MAX(Time)
FROM table_b b
WHERE a.Id = b.Id
)
) a 李小小丶 | 初学一级 | 园豆: 104
提问于:2019-03-26 17:26 显示帮助
使用"Ctrl+Enter"可进行快捷提交,评论支持部分 Markdown 语法:[link](http://example.com) _italic_ **bold** `code`。
< > 分享
分享您的问题
所有回答(6) 0 先帮你格式下,建议你把建表语句发过来,方便回答者调试,初步看你使用了很多子查询,可能是罪魁祸首。等你把建表语句发来,我执行下试试。 SELECT DISTINCT Id, Number, NAME, Time FROM ( SELECT Id, Number, NAME, Time FROM table_a a WHERE Time = ( SELECT MAX(Time) FROM table_a b WHERE a.Id = b.Id ) UNION ALL SELECT Id, Number, NAME, Time FROM table_b a WHERE Time = ( SELECT MAX(Time) FROM table_b b WHERE a.Id = b.Id ) ) a 会长 | 园豆:8398 (大侠五级) | 2019-03-26 17:45 感谢 支持( 0 ) 反对( 0 ) 李小小丶 | 园豆:104 (初学一级) | 2019-03-26 17:46 编辑文本 预览 上传图片
Ctrl+Enter键快速提交 0 Time =() 尝试修改为 not exists (..a.time<b.time..) 小叮当001 | 园豆:202 (菜鸟二级) | 2019-03-26 18:19 编辑文本 预览 上传图片
Ctrl+Enter键快速提交 0 可能是子查询过多,建议先系统了解一下查询慢的原因,可以对索引进行优化,对于你的数据库,没法了解,你可以建立一些索引,给你发一些概念资料,自己具体去学习,你可以用explain加sql语句试一下,你用的应该是全表扫描,效率最低的方式,
生产中,mysql在使用全表扫描时的性能是极其差的,所以MySQL尽量避免出现全表扫描
常见的索引扫描类型:
1)index / all
2)range
3)ref
4)eq_ref
5)const
6)system
7)null
从上到下,性能从最差到最好,我至少要达到range级别,当然也不是索引越多越好,毕竟索引也占系统资源,如果想优化自己的数据库可以往这个方向,
索引分类:
主键索引
普通索引
唯一索引
飞花飘絮 | 园豆:202 (菜鸟二级) | 2019-03-26 20:51 编辑文本 预览 上传图片
Ctrl+Enter键快速提交 0 要不要试试with as SiPenglei | 园豆:216 (菜鸟二级) | 2019-03-26 22:44 编辑文本 预览 上传图片
Ctrl+Enter键快速提交 0 你在子查询里面用了 "UNION ALL" (包含重复行),又在外查询使用 "DISTINCT" (取不同的行),是不是多此一举。可以使用 "UNION" (不含重复的行),然后去掉外查询。
SELECT Id ,Number ,Name ,Time FROM table_a a WHERE Time = (
SELECT MAX(Time) FROM table_a b WHERE a.Id = b.Id )
UNION
SELECT Id , Number , Name , Time FROM table_b a WHERE Time = (
SELECT MAX(Time) FROM table_b b WHERE a.Id = b.Id )
是不是这个逻辑 AYard | 园豆:436 (菜鸟二级) | 2019-03-27 10:04 是的 语法上可以改成union 但是想提升速度是不是只能建立索引 支持( 0 ) 反对( 0 ) 李小小丶 | 园豆:104 (初学一级) | 2019-03-27 10:08 @李小小丶: 你这两个子句是不是写错了,它的结果和这句是一样的
"SELECT Id ,Number ,Name ,Time FROM table_a a WHERE Time = (
SELECT Time FROM table_a b WHERE a.Id = b.Id ) "
你是不是想这样写:
"SELECT Id ,Number ,Name ,Time FROM table_a WHERE Time = (
SELECT MAX(Time) FROM table_a ) " 支持( 0 ) 反对( 0 ) AYard | 园豆:436 (菜鸟二级) | 2019-03-27 11:53 编辑文本 预览 上传图片
Ctrl+Enter键快速提交 0 先explain看一下执行情况,你这种情况多半是索引没用好 yanch | 园豆:204 (菜鸟二级) | 2019-03-28 19:04 编辑文本 预览 上传图片
Ctrl+Enter键快速提交
清除回答草稿
您需要 登录 以后才能回答,未注册用户请先 注册 。