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