技术咨询: Mysql 查询优化

2018-12-24 08:08:12 +08:00
 dielianxiang

Mysql 一张表有 1400W 条数据,加了索引,查询一下也需要 2-5S。除了分库分表 有没有其他的好办法?

最重要的是我还需要 Group 里面的数据进行 Sum 操作,这时候就更慢了..

求大神赐教。

4666 次点击
所在节点    数据库
54 条回复
realpg
2018-12-24 12:39:22 +08:00
进数据库的从来都是简单查询 逻辑在库外实现
一些统计类 适当使用触发器之类进行冗余计算
zeraba
2018-12-24 12:42:02 +08:00
force index(created_at) 试试
Marstin
2018-12-24 13:44:14 +08:00
sum(value)的值考虑缓存下来,走个定时任务去统计
dielianxiang
2018-12-24 16:04:20 +08:00
我先试一下 谢谢各位
chenqh
2018-12-24 16:05:26 +08:00
1400W 拼什么要分表。。
SakuraKuma
2018-12-24 16:36:29 +08:00
赞同#41,查出来在业务机上跑逻辑。
group by 这种耗时操作还是少用好。
dielianxiang
2018-12-24 17:30:09 +08:00
各位,我后来把阿里云的服务器的数据 down 到本地跑,同样的数据同样的 sql 语句,跑完只要 0.3s. 后来我就升级了一下数据库的配置( 1 核 2G 升级到 2 核 4G ),现在执行结果是 0.4S 。但是仍然比我本地慢。

后面我将继续根据大神的指点,将 group 操作放到业务逻辑里面去计算。谢谢各位了。
dielianxiang
2018-12-24 17:33:26 +08:00
前期进行 group by 是因为需要根据是时间 将各个 rid 的值进行累加。如果后面效率不行 我将考虑 group by 和 sum 操作由业务代码处理。但是数据量巨大,也许会有其他的问题。
leon0903
2018-12-24 17:39:07 +08:00
mark 我也算是 mysql 入门菜鸡
likuku
2018-12-24 20:52:22 +08:00
2 核 4G ... 现在真都这么省的么?几年前买二手服务器托管是直接上 16 核 16G RAM SSDx4 RAID10
akira
2018-12-24 22:06:46 +08:00
增加 2 个字段,内容分别是
DATE_FORMAT(a.created_at,"%m-%d")
DATE_FORMAT(a.created_at,"%H")
然后,sql 里面直接获取这个字段,不要再去计算了,这样查询速度应该可以有很大的提升
-------------
这种汇总统计需求的 sql,其实几秒出结果已经可以了,因为都是会做缓存的。
palfortime
2018-12-24 22:47:54 +08:00
可以把 start 和 end 之间的时间按小时分割,分成几个 sql 进行查询,这样子可以去掉按小时来 group_by,查出来的数据量也不会多太多,又可以做成并发。
dielianxiang
2018-12-25 08:46:42 +08:00
@likuku 哈哈 2 核 4g 够用了,前几天我还是用一核 2g
dielianxiang
2018-12-25 08:48:30 +08:00
@akira 你是说数据库冗余这两个列么? DATE_FORMAT(a.created_at,"%m-%d") 和 DATE_FORMAT(a.created_at,"%H")

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/520314

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX