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

时间:2019-02-26 13:35:11

标签: mysql

现在,当我同时启动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设置。 表有2000万条记录 查询速度是单次3s,我需要为此SQL处理1000次,但是mysql的并发性真的很差,我同时打开10个连接,每个查询需要14s。

新想法:  fb字段(varchar(513))确实不适合索引,我想添加将存储base64(fb)加密的fc字段,然后按fc字段分组。这个想法有任何风险吗?

1 个答案:

答案 0 :(得分:0)

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

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

查询的性能将与不重复(a,b,fb)的数量大致成比例。如果您没有太多,它应该会非常快地工作。

相同的索引也将有助于JOIN。