Mysql 简明教程

MySQL - Non-Clustered Index

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

MySQL 中有两种类型的索引 -

  1. Clustered Index

  2. Non-Clustered Index

MySQL 中的聚集索引可以按照创建所需的键列对表格中的所有行进行排序,从而手动对表格中的数据进行排序。另一方面,非聚集索引将数据存储在一个位置,索引及该数据的指针存储在另一个位置。

MySQL Non-Clustered Indexes

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

然而,MySQL 并未提供明确创建聚集和非聚集索引的方法。主键被视为聚集索引。未定义主键时,第一个 UNIQUE NOT NULL 键即为聚集索引。表上的其他索引均为非聚集索引。

Syntax

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

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

Example

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

首先使用下面所示的 CREATE TABLE 语句创建学生表——

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);

Note - 由于 MySQL 没有非聚集索引的具体规定,我们使用了常规的 CREATE INDEX 语句。

Verification

要验证表 CUSTOMERS 上是否已创建索引,可以使用 DESC 命令显示表定义——

DESC CUSTOMERS;

正如我们在下面看到的那样,CUSTOMERS 表上创建了两个索引。主键索引为聚集索引,多重索引为非聚集索引——

Creating a Non-Clustered Index Using NodeJS

除了使用 SQL 查询之外,我们还可以使用客户端程序创建非聚集索引。

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

Syntax

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

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

Example

以下是使用 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)
  });
});

Output

输出结果如下:

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: ''}
]