下面是某个视图中的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
先帮你格式下,建议你把建表语句发过来,方便回答者调试,初步看你使用了很多子查询,可能是罪魁祸首。等你把建表语句发来,我执行下试试。
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
感谢
Time =() 尝试修改为 not exists (..a.time<b.time..)
可能是子查询过多,建议先系统了解一下查询慢的原因,可以对索引进行优化,对于你的数据库,没法了解,你可以建立一些索引,给你发一些概念资料,自己具体去学习,你可以用explain加sql语句试一下,你用的应该是全表扫描,效率最低的方式,
生产中,mysql在使用全表扫描时的性能是极其差的,所以MySQL尽量避免出现全表扫描
常见的索引扫描类型:
1)index / all
2)range
3)ref
4)eq_ref
5)const
6)system
7)null
从上到下,性能从最差到最好,我至少要达到range级别,当然也不是索引越多越好,毕竟索引也占系统资源,如果想优化自己的数据库可以往这个方向,
索引分类:
主键索引
普通索引
唯一索引
要不要试试with as
你在子查询里面用了 "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 )
是不是这个逻辑
是的 语法上可以改成union 但是想提升速度是不是只能建立索引
@李小小丶: 你这两个子句是不是写错了,它的结果和这句是一样的
"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 ) "
先explain看一下执行情况,你这种情况多半是索引没用好