orm 新增普通索引
前言
对于游戏数据来说,普通索引
大多作用在日志数据上,按时间
,玩家
,道具ID
,等等条件分页查询检索,数据量通常很庞大,不同的普通索引可以做联合条件查询,如果想普通索引也加上本地缓存页的话,需要处理好缓存
是否失效的判断,对于主键唯一索引来说就是对比本次查询的范围的数据总量
和缓存总量
是否相等,数据总量
失效是其中的某个缓存过期。而普通索引
基于范围,分页来查询不太好维护数据总量
和缓存总量
数据的控制,而且排序上面数据可能存在偏差,就比如如果是用lua table.sort
基于快速排序是不稳定的排序算法,两个相等的数据,多次排序后位置可能被交换,这时候可能出现缓存
结果和数据库查询结果不一致的情况,所以对于普通索引,我仅仅是实现了一些常用的接口,每次调用都是会访问数据库的。
设置普通索引
set_index(name, ...)
1 |
|
设置索引和设置主键差不多,需要额外提供一个索引名称。
新增,删除,修改索引
新增索引,删除索引
目前这个操作是支持的,但是用的时候需要谨慎,尽量在停服的时候做,避免卡顿数据库。修改索引
不支持,一般就先删除,再新增。
查询注意点
1 |
|
就以上面的表
为例子。
存在两个普通索引 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会报错。