跳至主要內容

索引

微信公众号:储凡About 4 min

索引

索引是为了加速对表中数据行的检索而创建的一种分散的存储结构。 索引是针对表而建立的,它是由数据页面以外的索引页面组成的,每个索引页面中的行都会含有逻辑指针,以便加速检索物理数据。

常见MYSQLOracle等数据库都有使用到索引,因为这能够大大加速对数据的检索, 甚至像ElasticSearch数据库还出现了倒排索引open in new window 这样的概念。

Sequelize 框架本身一套ORM映射框架,处理编程对象和数据库表字段关系的映射。当表中的字段设置了索引, 再到Sequelize的模型中配置利用indexes字段配置索引,即可在查询时使用索引。例如:

const {Sequelize} = require('sequelize')
const sequelize = new Sequelize('postgres://user:pass@142vip.cn:5432/142vip')

const User = sequelize.define('User', { /* attributes */}, {
  indexes: [
    // 创建唯一索引
    {
      unique: true,
      fields: ['name']
    },
  ]
})

User表中的name字段创建唯一索引。

唯一索引:在表中限制该字段唯一、不重复,同时支持查询检索

索引的分类和用途有很多,Sequelize框架对索引的支持有限,这里给出简单的配置例子:

const { Sequelize } = require('sequelize')
const sequelize = new Sequelize('postgres://user:pass@142vip.cn:5432/142vip')

/**
 * 定义用户表对应的模型
 */
const User = sequelize.define('User', {
  // ... 一些配置
}, {
  indexes: [
    // 创建唯一索引,unique用来判断是否为唯一索引
    {
      unique: true,
      fields: ['name']
    },

    // 使用 jsonb_path_ops 运算符对data字段创建 gin 索引
    {
      fields: ['data'],
      using: 'gin',
      operator: 'jsonb_path_ops'
    },

    // name字段配置索引名称,默认的索引名是: 表明名_列名
    // 创建联合索引,涉及多个字段
    {
      name: 'public_by_author',
      fields: ['author', 'status'],
      where: {
        status: 'public'
      }
    },

    // 对于排序字段创建BTree索引
    {
      name: 'title_index',
      using: 'BTREE',
      fields: ['author', {
        name: 'title',
        collate: 'en_US',
        order: 'DESC',
        length: 5
      }]
    }
  ]
})

可以通过源码open in new window 查看indexes字段的类型支持

在介绍Sequelize创建连接实例是,介绍到Sequelize对象提供的sync函数,这个API可以在连接时将模型同步到数据库表中。

当模型中配置indexes字段支持索引时,使用sequelize.sync()函数同样可以将模型中定义的索引同步到表中