由于数据超过亿,需要按照userid和name 分组然后取出每组中amt最大的前三条记录;
CREATE TABLE `test` (
`userid` bigint(20) DEFAULT NULL,
`carid` int(11) DEFAULT NULL,
`amt` decimal(18,2) DEFAULT NULL,
`flg_fee` int(11) DEFAULT NULL,
`name` varchar(128) DEFAULT NULL
)
SELECT
a.*
FROM
test a
WHERE 3 >
(SELECT
COUNT(*)
FROM
test
WHERE flg_fee = 1
AND amt > a.amt
AND name=a.name
AND userid=a.userid)
ORDER BY a.userid,a,name;
由于数据量太大,所以在没有对sql进行人和优化和创建索引的时候SQL执行时间大概是在2个小时。
后来给WHERE语句中的字段userId和name增加了索引,同时对SQL进行了优化,
SELECT
test.*
FROM
test a
WHERE 3 >
(SELECT
COUNT(*)
FROM
test
WHERE
userid=a.userid
AND name=a.name
AND flg_fee = 1
AND amt > a.amt
)
ORDER BY a.userid,
a.name ;"
WHERE子句里面的顺序一定要注意,先使用
userid=a.userid
AND name=a.name 这样让SQL充分使用索引,效率有了明显的提升,执行时间在20分组左右。