数据库中经常分组查询的表如何做性能优化(group by)
2016-05-20 16:13
393 查看
一、原sql
SELECT U.NAME AS NAME,
U.ACCOUNT,
U.REGION_NAME,
U.ORG_NAME,
L.LOGIN_TIME AS M
FROM PUB_USER U,
(SELECT t.CREATOR, MAX(t.LOGIN_TIME) LOGIN_TIME
FROM PUB_USER_LOGIN t
GROUP BY t.CREATOR) L
WHERE U.STATUS = '1'
AND L.CREATOR = U.ID
AND L.LOGIN_TIME < DATE_ADD(CURDATE(), INTERVAL - 1 YEAR)
ORDER BY L.LOGIN_TIME DESC
查询63行数据需要三秒以上
二、分析问题
数据量分析:
表PUB_USER:1k左右
表PUB_USER_LOGIN :10W行以上
主要消耗时间的是下面这个语句
SELECT t.CREATOR, MAX(t.LOGIN_TIME) LOGIN_TIME
FROM PUB_USER_LOGIN t
GROUP BY t.CREATOR
三、解决上面语表中数据分组缓慢问题
给分组查询的字段添加联合索引,mysql语法如下:
CREATE INDEX PUB_USER_LOGIN_TWO USING BTREE ON PUB_USER_LOGIN(CREATOR,LOGIN_TIME)
添加索引之后查询时间在0.01秒左右
SELECT U.NAME AS NAME,
U.ACCOUNT,
U.REGION_NAME,
U.ORG_NAME,
L.LOGIN_TIME AS M
FROM PUB_USER U,
(SELECT t.CREATOR, MAX(t.LOGIN_TIME) LOGIN_TIME
FROM PUB_USER_LOGIN t
GROUP BY t.CREATOR) L
WHERE U.STATUS = '1'
AND L.CREATOR = U.ID
AND L.LOGIN_TIME < DATE_ADD(CURDATE(), INTERVAL - 1 YEAR)
ORDER BY L.LOGIN_TIME DESC
查询63行数据需要三秒以上
二、分析问题
数据量分析:
表PUB_USER:1k左右
表PUB_USER_LOGIN :10W行以上
主要消耗时间的是下面这个语句
SELECT t.CREATOR, MAX(t.LOGIN_TIME) LOGIN_TIME
FROM PUB_USER_LOGIN t
GROUP BY t.CREATOR
三、解决上面语表中数据分组缓慢问题
给分组查询的字段添加联合索引,mysql语法如下:
CREATE INDEX PUB_USER_LOGIN_TWO USING BTREE ON PUB_USER_LOGIN(CREATOR,LOGIN_TIME)
添加索引之后查询时间在0.01秒左右
相关文章推荐
- mysql数据库中批量更新
- 杂
- SQLSERVER的字段类型说明
- MySQL中多列索引
- 论ORACLE 9i 的体系图为什么这么金典
- mysql新建用户表,赋权,远程登陆
- sql注入分类
- redis
- SQL Server 创建约束图解 唯一 主键
- MSSQL EXISTS子查询
- 【NoSql】Redis
- redis环境配置
- mongodb启动
- 六十 数据库访问 使用SQLAlchemy
- mysql表中让一个表中某个字段值加1
- mysql innobackupex备份工具
- 五十九 数据库访问 使用MySQL
- 两个oracle之间建立db link
- 五十八 数据库访问使用SQLite
- 160519、Oracle中将查询出的多条记录的某个字段拼接成一个字符串的方法