MySQL - 非聚集索引
MySQL 中的索引用于更快地从数据库表或视图中检索数据。用户在应用程序级别无法看到索引,但它们在后台工作以加快搜索和查询速度。
MySQL 中有两种类型的索引 -
聚集索引
非聚集索引
MySQL 中的聚集索引可以通过根据用于创建表的关键列对表中的所有行进行排序来手动对表中的数据进行排序。另一方面,非聚集索引将数据存储在一个位置,而包含指向该数据的指针的索引则存储在另一个位置。
MySQL 非聚集索引
非聚集索引将数据存储在一个位置,而其索引则存储在另一个位置。这些索引包含指向实际数据的指针。
但是,MySQL 不提供显式创建聚集索引和非聚集索引的方法。主键 (PRIMARY KEY) 被视为聚集索引。并且,当未定义主键时,第一个唯一非空键 (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 表上创建了两个索引。 PRIMARY KEY 索引是聚集索引,多重索引是非聚集索引 −
| Field | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| ID | int | NO | PRI | NULL | |
| NAME | varchar(20) | NO | MUL | NULL | |
| AGE | int | NO | NULL | ||
| ADDRESS | char(25) | YES | NULL | ||
| SALARY | decimal(18, 2) | YES | 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"
});
//连接到 MySQL
con.connect(function (err) {
if (err) throw err;
console.log("Connected!");
console.log("--------------------------");
//创建数据库
sql = "create database TUTORIALS"
con.query(sql);
//选择数据库
sql = "USE TUTORIALS"
con.query(sql);
//创建表
sql = "CREATE TABLE STUDENTS(RNO INT NOT NULL,NAME VARCHAR(50),AGE INT,DEPT VARCHAR(50));"
con.query(sql);
//创建索引
sql = "CREATE INDEX nc_index ON STUDENTS(RNO, DEPT);"
con.query(sql);
//描述表
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: ''}
]

