问题背景:
原表设计如下,业务上是把登陆用户的商品以priority顺序方式列表显示,但是此列表显示非常慢。
create table t_origin
(
user_id varchar2(11),
goods_id varchar2(19),
priority number(2),
update_time DATE
);
comment on t_origin.user_id "用户ID";
comment on t_origin.goods_id "商品ID";
comment on t_origin.priority "商品优先级";
comment on t_origin.update_time "记录更新时间";
问题定位:
1.查询登陆用户商品列表,这个SQL查询业务上非常简单,表结构设计也很合理
2.导致SQL查询非常慢的根本原因是t_origin表数据量过大,接近10亿
解决问题:
1.优化SQL,该分区的建立分区,该索引的建立索引;
2.想办法减少t_origin表数据量;要减少t_origin数量,可以将goods_id列扩展成多列如:goods_id_01, goods_id_02, goods_id_03等;如果将goods_id列扩展成10列,则t_origin表数据量减为原先的10分之一。
前提:每个用户的商品列表数目必须有最大值,如10、20等,如果用户的商品列表数没有最大值,则无法通过扩展列来减少数据量
原表设计如下,业务上是把登陆用户的商品以priority顺序方式列表显示,但是此列表显示非常慢。
create table t_origin
(
user_id varchar2(11),
goods_id varchar2(19),
priority number(2),
update_time DATE
);
comment on t_origin.user_id "用户ID";
comment on t_origin.goods_id "商品ID";
comment on t_origin.priority "商品优先级";
comment on t_origin.update_time "记录更新时间";
问题定位:
1.查询登陆用户商品列表,这个SQL查询业务上非常简单,表结构设计也很合理
2.导致SQL查询非常慢的根本原因是t_origin表数据量过大,接近10亿
解决问题:
1.优化SQL,该分区的建立分区,该索引的建立索引;
2.想办法减少t_origin表数据量;要减少t_origin数量,可以将goods_id列扩展成多列如:goods_id_01, goods_id_02, goods_id_03等;如果将goods_id列扩展成10列,则t_origin表数据量减为原先的10分之一。
前提:每个用户的商品列表数目必须有最大值,如10、20等,如果用户的商品列表数没有最大值,则无法通过扩展列来减少数据量