MySQL - 非聚集索引



MySQL 中的索引用于从数据库表或视图中更快地检索数据。用户在应用程序级别看不到索引,但它们在后台工作以加快搜索和查询速度。

MySQL 中有两种类型的索引:

  • 聚集索引

  • 非聚集索引

MySQL 中的聚集索引可以通过基于用于创建它的键列对表中的所有行进行排序来手动排序表中的数据。另一方面,非聚集索引将数据存储在一个位置,并将包含指向此数据的指针的索引存储在另一个位置。

MySQL 非聚集索引

非聚集索引将数据存储在一个位置,而其索引存储在另一个位置。这些索引包含指向实际数据的指针。

但是,MySQL 没有提供明确创建聚集索引和非聚集索引的方法。主键被视为聚集索引。如果没有定义主键,则第一个 UNIQUE NOT NULL 键是聚集索引。表上的所有其他索引都是非聚集索引。

语法

以下是创建 MySQL 表上的非聚集索引的基本语法:

CREATE INDEX index_name ON table_name(column_name(s));

示例

让我们来看一个在名为“Students”的表上创建非聚集索引的示例。此表包含学生详细信息,例如他们的学号、姓名、年龄和系别。在这里,我们尝试使用以下查询在“学号”和“系别”列上应用非聚集索引:

让我们首先使用下面显示的 CREATE TABLE 语句创建 Students 表:

CREATE TABLE CUSTOMERS(
   ID INT NOT NULL,
   NAME VARCHAR (20) NOT NULL,
   AGE  INT NOT NULL,
   ADDRESS CHAR (25),
   SALARY DECIMAL (20, 2),
   PRIMARY KEY(ID)
);

使用以下查询,在 NAME 列上创建一个非聚集索引:

CREATE INDEX nc_index ON CUSTOMERS(NAME);

注意 - 由于 MySQL 没有专门为非聚集索引提供的功能,因此我们使用通常的 CREATE INDEX 语句。

验证

要验证是否在 CUSTOMERS 表上创建了索引,请使用 DESC 命令显示表定义:

DESC CUSTOMERS;

如下所示,在 CUSTOMERS 表上创建了两个索引。主键索引是聚集索引,多索引是非聚集索引:

字段 类型 Null 默认值 额外
ID int PRI NULL
NAME varchar(20) MUL NULL
AGE int NULL
ADDRESS char(25) NULL
SALARY decimal(18, 2) NULL

使用 NodeJS 创建非聚集索引

除了使用 SQL 查询创建非聚集索引外,我们还可以使用客户端程序在 MySQL 数据库上创建它们。

MySQL NodeJS 连接器 **mysql2** 提供了一个名为 **query()** 的函数,用于在 MySQL 数据库中执行 CREATE INDEX 查询。

语法

以下是使用 NodeJS 在 MySQL 数据库中创建非聚集索引的语法:

sql = "CREATE INDEX index_name ON table_name(column_name(s))";
con.query(sql);

示例

以下是使用 NodeJS 实现此操作的方法:

var mysql = require('mysql2');
var con = mysql.createConnection({
    host: "localhost",
    user: "root",
    password: "Nr5a0204@123"
});

  //Connecting to MySQL
  con.connect(function (err) {
  if (err) throw err;
  console.log("Connected!");
  console.log("--------------------------");

  //Creating a Database
  sql = "create database TUTORIALS"
  con.query(sql);

  //Select database
  sql = "USE TUTORIALS"
  con.query(sql);

  //Creating table
  sql = "CREATE TABLE STUDENTS(RNO INT NOT NULL,NAME VARCHAR(50),AGE INT,DEPT VARCHAR(50));"
  con.query(sql);

  //Creating Index
  sql = "CREATE INDEX nc_index ON STUDENTS(RNO, DEPT);"
  con.query(sql);

  //Describing the Table
  sql = "DESC STUDENTS;"
  con.query(sql, function(err, result){
    if (err) throw err
    console.log(result)
  });
});

输出

产生的输出如下:

Connected!
--------------------------
[
  {Field: 'RNO',Type: 'int',Null: 'NO',Key: 'MUL',Default: null,Extra: ''},
  {Field: 'NAME',Type: 'varchar(50)',Null: 'YES',Key: '',Default: null,Extra: ''},
  {Field: 'AGE',Type: 'int',Null: 'YES',Key: '',Default: null,Extra: ''},
  {Field: 'DEPT',Type: 'varchar(50)',Null: 'YES',Key: '',Default: null,Extra: ''}
]
广告