现在,当同时启动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字段分组。这个想法的风险是什么?
对于内部查询,您需要(a,b,fb,c)
上的索引。
MySQL可以通过快速查找每个(a,b,fb)的max(c)来使用该索引来执行内部查询。有关详细信息,请参阅the manual。
查询的性能将大致与distinct(a,b,fb)的计数成比例。如果你没有太多,它应该工作得非常快。
相同的索引也有助于JOIN。