首页新闻找找看学习计划

关于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
< >
分享
所有回答(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
会长 | 园豆:7797 (大侠五级) | 2019-03-26 17:45

感谢

支持(0) 反对(0) 李小小丶 | 园豆:104 (初学一级) | 2019-03-26 17:46
0

Time =() 尝试修改为 not exists (..a.time<b.time..)

小叮当001 | 园豆:202 (菜鸟二级) | 2019-03-26 18:19
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
0

要不要试试with as

SiPenglei | 园豆:216 (菜鸟二级) | 2019-03-26 22:44
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
0

先explain看一下执行情况,你这种情况多半是索引没用好

yanch | 园豆:204 (菜鸟二级) | 2019-03-28 19:04
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册