数据库查询优化到底该怎么做?

Xrall · 2024-9-4 17:42:24 · 303 次点击
#### 配置参数前提

目前数据库是 MySQL5.7
服务器内存 16g
单表数据 1G
数据行数 200W 的数据
当年的数据截止目前为止大概在 50W
表数据是 订单和订单详情 清洗后的数据。
业务要求统计一年内产生的订单相关信息

#### SQL

```sql
select [指定的一些业务数据需要字段,含一个字段 sum 求和并除以 1000000 单位转换] from t_order_stats where is_collec = 0
where is_collect=0 and pro_removal_time between '2024-01-01 00:00:00' and '2024-09-05 23:59:59' group by order_id
-- 就这样的查询在没有缓存的情况下就需要 6818ms
-- 至于为什么没带其他条件是想的直接拿出来 代码里面全部去分类分组去求。
```

### explain 计划

| id   | select_type | table         | type  | possible_keys                                                | key                        | key_len | ref     | rows | Extra       |
| ---- | ----------- | ------------- | ----- | ------------------------------------------------------------ | -------------------------- | ------- | ------- | ---- | ----------- |
| 1    | SIMPLE      | t_order_stats | index | t_order_comprehensive_coferage_IDX, t_order_stats_order_id_IDX, t_order_trans_idx | t_order_stats_order_id_IDX | 8       | 2007971 | 50   | Using where |

`t_order_stats_order_id_IDX` 索引只有 `order_id`

#### 疑惑

is_collect 没有辨识度 只有 0/1
哪怕是加上 limit 1 也异常慢

所以这种查询到底如何去处理,因为做的是大屏幕展示的,很多的数据都是时间条件查询。

那到底要去如何优化才能处理好这类查询。

看到别个百万千万上亿查询都洒洒水。实在想不通。

至于数据库配置内存已经是升级过一轮了。加不了一点
举报· 303 次点击
登录 注册 站外分享
23 条回复  
dode 小成 2024-9-12 09:22:00
如果没有固态硬盘,换成固态硬盘基本可以解决问题
wxf666 小成 2024-9-5 13:49:03
@xuanbg #25 现在千元消费级固态,不是都支持 100W 随机查找/秒 了吗?

换句话说,即使服务器内存只有几百 MB ,MySQL 完全用不了缓存,所有读写都走固态 IO ,

随机查找 50W 行,也应该 0.5 秒就能搞定?

https://i.imgur.com/F29pmQ6.png https://i.imgur.com/F29pmQ6.png

https://i.imgur.com/uB205yf.jpeg
SDYY 小成 2024-9-5 12:12:37
一个月前的数据还会修改吗,先缓存历史数据,最新数据再计算后汇总
redog 小成 2024-9-5 12:02:29
表里有主键吗?把主键去掉,建立一个,按 is_collect ,pro_removal_time ,id 的 UNIQUE 索引,这样应该会形成聚簇索引,第一次创建时因为你已经有 200W 的记录了,会对这 200W 记录重新物理排序,所以会很慢,另外就是插入和更改 is_collect 时会慢一点,但这个数据量来看应该不会有太大感知。
好处是会按上面的顺序物理排序,这样你前面的条件一出,回表取值的速度会大大加快,捞数据是顺序读取的。
另外一种就是建一个覆盖索引,按你之前的条件,前面必须是 is_collect ,pro_removal_time ,id ,然后继续跟所需要的业务字段,那个求和的也要算进来。
lancelotfh 小成 2024-9-5 11:01:34
先把数据捞出来,建张临时表去跑
xuanbg 小成 2024-9-5 10:38:04
纯粹是捞的数据太多造成的,啥都不好使。再怎么优化,也就 5 秒的水平。
threeBoy 小成 2024-9-5 09:10:35
没格式看的头皮发麻, 最简单有效的方式就是再弄一个报表专用数据库 clickhouse 之类的
aylsss 小成 2024-9-4 22:44:53
1.建个联合索引:CREATE INDEX idx_pro_removal_order ON t_order_stats (pro_removal_time, order_id);

2.查询时把 is_collect=0 放到最后面
oneisall8955 小成 2024-9-4 22:05:45
所以,这个表 50w 行统计出来,会有人看吗?
liuhuan475 小成 2024-9-4 21:24:48
分区表试试
123下一页
返回顶部