举个例子,查询用户购买记录表
需求:查询某用户最近的购买 10 个的记录,查询某用户购买记录表的某某字段为 XXX 的最近的 6 个记录,查询某用户最新的一个购买记录。这 3 个查询的结果集,未来有可能会需要展示到同一个界面上。
这个查询需求怎么实现最好呢?各位有哪些实现方式?各位觉得直接在 select 上写 where+order by+Limit 合适么,我感觉直接在 select 上写 limit+order by+where 有点不放心,万一数据量大怎么办?
我的话,在 Postgresql 是这样的搞,建立一个表叫“user_last_buy_record”。主键是用户 id,还有三个字段,第一个叫 last_array 和第二个叫 last_xxx_array,这两个数据类型都是长整型数组,第三个叫 last_new,数据类型是长整型。
每次插入用户购买记录时,会把插入的 id 修改到 user_last_buy_record 表的 last_array 里,更新 last_array 字段,如果插入的数据中的某字段为 XXX,则把插入的 id 修改到 last_xxx_array 。( last_xxx_array,last_array,把数组的元素位置从第二位开始都往后挪,最终倒数第二个替换掉倒数第一个,然后把新的值修改到数组的第一个位置)
查询时通过 user_last_buy_record 表记录的主键 id 去 left join 查询,相比 where+limit+order by 的方式有什么问题呢。
对于这个需求,各位觉得有哪些更合适的实现方式呢?
1
opengps 2020-07-06 15:19:46 +08:00
只要能按预期走索引,数据量在大到需要分表的程度之前,似乎没啥需要你担心的。我的第一版 sqlserver 的线上 gps 轨迹库从十几亿行数据里取一次取 1000 条毫无延迟表现。
怕数据量大出问题,就从一开始尽可能规避 join,让单表的功能足够单一的去读写 |