在mysql中为每个组获取具有最大值的行的效率?

问题描述 投票:0回答:1

现在,当同时启动10个查询连接时,我的查询问题很慢。下面是我的sql。我想通过“a”和“b”和“fb”得到t1组的max(“c”)数据

SELECT t1.* FROM t1 partition(p68)
        INNER JOIN (
            SELECT a, b, fb, max(c) as c
            FROM t1 partition(p68) where a=1168          
            GROUP BY a, b, fb
        ) t2 ON (t1.a = t2.a and t1.b=t2.b and t1.fb=t2.fb and t1.c = t2.c)

我在“a”字段上创建了散列分区,每个分区有200000条记录,也有“a”字段和“b”字段的索引。 a,b,c是int类型,fb是varchar类型

PARTITIONS 100


KEY `key1` (`a`,`b`)

如何为这个sql增加sql查询速度?有更好的方法吗? mysql版本是5.6

现在我添加了索引(a,b,c),删除PARTITIONS设置。表有20万条记录,查询速度是3s单次,我需要为这个sql处理1000次,但mysql的并发性真的很糟糕,我同时打开10个连接,每个查询需要14s。

新想法:fb字段(varchar(513))真的不适合索引,我想添加fc字段,它将存储base64(fb)加密,然后我将按fc字段分组。这个想法的风险是什么?

mysql
1个回答
0
投票

对于内部查询,您需要(a,b,fb,c)上的索引。

MySQL可以通过快速查找每个(a,b,fb)的max(c)来使用该索引来执行内部查询。有关详细信息,请参阅the manual

查询的性能将大致与distinct(a,b,fb)的计数成比例。如果你没有太多,它应该工作得非常快。

相同的索引也有助于JOIN。

© www.soinside.com 2019 - 2024. All rights reserved.