数组索引通过映射“查找目标”与“物理位置”实现O(1)定位,适用于小规模数据;有序数组支持主键直接寻址,哈希数组支持非主键首字母快速筛选,需同步维护插入/删除/更新操作。

用数组实现简易数据库索引目录,核心是把“查找目标”和“物理位置”建立映射关系,再借助数组的O(1) 随机访问能力快速跳转。它不替代 B+ 树等专业索引,但对小规模数据、内存表、教学演示或嵌入式场景非常实用——关键是逻辑清晰、实现轻量、定位直接。
用有序数组模拟主键索引目录
假设你有一张用户表(内存中),每条记录含 id(主键,整型)、name、age。共 1000 条,id 从 1 到 1000 连续且唯一。
- 建一个长度为 1000 的整型数组
indexMap,其中indexMap[i]存放id == i+1的记录在数据数组中的下标(即内存地址偏移) - 例如:
users[5]是id=6的用户,则indexMap[5] = 5;若id=100的用户在users[99],则indexMap[99] = 99 - 查询
id=42:直接取indexMap[41]→ 得到下标 → 访问users[indexMap[41]],一步到位,无需遍历
用哈希数组支持非主键字段快速定位
当需按 name 查找时,纯有序数组无效。可构建一个轻量哈希数组(如固定大小 256 槽的桶数组):
- 定义哈希函数:
hash(name) = name.charCodeAt(0) % 256(取首字母 ASCII 码模 256) - 每个槽存一个数组(链地址法),里面是所有首字母匹配的记录下标,如
hashTable[97]('a' 的 ASCII)存 [3, 18, 204],对应 users[3]、users[18]、users[204] 姓名都以 'a' 开头 - 查
name="alice":算出 hash=97 → 取hashTable[97]→ 遍历该小数组,比全表扫描快得多(平均只需查几条)
动态维护索引数组的关键操作
插入、删除时必须同步更新索引,否则定位失效:
-
插入新记录:先追加到
users末尾;若id已知,直接写入indexMap[id-1];若按name建哈希索引,计算 hash 后 push 下标到对应桶 -
删除记录:不能真删(避免下标错位),推荐“软删除”——设
users[i].deleted = true,并在索引数组中标记无效(如indexMap[id-1] = -1);后续查询时跳过 -
更新主键:慎用。若必须改
id,需先清旧索引位,再填新索引位,确保双向一致
实战提升变量定位效率的技巧
真正让数组索引“跑起来”,要结合数据特征和访问模式优化:
- 对频繁查询的字段(如订单状态、用户类型),预建多个索引数组,用空间换时间
- 若记录总数固定且 ID 稀疏(如 id ∈ {1001, 2005, 3012}),改用对象字面量
{1001: 0, 2005: 1, 3012: 2}替代大数组,避免内存浪费 - 配合二分查找:若按时间戳排序,可用
Array.prototype.findIndex()+ 自定义比较函数,在有序时间索引数组中做范围查询(如“2026-05-01 到 2026-05-10 的订单”) - Node.js 中可封装为类,暴露
findByPk(id)、findByField(field, value)方法,内部自动路由到对应索引结构










