orm 新增普通索引

前言

对于游戏数据来说,普通索引大多作用在日志数据上,按时间玩家道具ID,等等条件分页查询检索,数据量通常很庞大,不同的普通索引可以做联合条件查询,如果想普通索引也加上本地缓存页的话,需要处理好缓存是否失效的判断,对于主键唯一索引来说就是对比本次查询的范围的数据总量缓存总量是否相等,数据总量失效是其中的某个缓存过期。而普通索引基于范围,分页来查询不太好维护数据总量缓存总量数据的控制,而且排序上面数据可能存在偏差,就比如如果是用lua table.sort基于快速排序是不稳定的排序算法,两个相等的数据,多次排序后位置可能被交换,这时候可能出现缓存结果和数据库查询结果不一致的情况,所以对于普通索引,我仅仅是实现了一些常用的接口,每次调用都是会访问数据库的。

设置普通索引

set_index(name, ...)

1
2
3
4
5
6
7
8
9
10
local ormobj = ormtable:new("t_player")
:int64("player_id")
:int64("role_id")
:string32("nickname")
:uint8("age")
:set_keys("player_id","role_id")
:set_index("age_index", "age")
:set_index("role_name_index", "role_id", "nickname")
:set_cache(500, 100)
:builder(adapter)

设置索引和设置主键差不多,需要额外提供一个索引名称。

新增,删除,修改索引

  • 新增索引,删除索引
    目前这个操作是支持的,但是用的时候需要谨慎,尽量在停服的时候做,避免卡顿数据库。

  • 修改索引
    不支持,一般就先删除,再新增。

查询注意点

1
M:idx_get_entry(query)

就以上面的为例子。
存在两个普通索引 age_index(age), role_name_index(role_id, nickname)
我们查询的时候可以使用:
query({age = 0, role_id = 0})
query({age = 0})
query({role_id = 0})
query({role_id = 0, nickname = "xx"})

但是不能使用:
query({nickname = "xx"})
因为nickname单独拎出来,并没有索引,它仅仅作为role_name_index的联合索引,查询必须符合最左前缀原则,不然没有命中索引,会走全表扫描。这样查询的话 orm的API会报错。

orm代码

orm测试代码


orm 新增普通索引
https://huahua132.github.io/2025/04/01/skynet_fly_ss/orm_index/
作者
huahua132
发布于
2025年4月1日
许可协议