MySQL - 删除索引
- MySQL DROP INDEX 语句
- MySQL ALTER... DROP 语句
- 删除 PRIMARY KEY 或 UNIQUE 约束
- 使用客户端程序删除索引
MySQL 数据库中的 DROP 语句用于删除现有的数据库对象,例如表、索引、视图或存储过程。每当我们使用 DROP 语句删除任何数据库对象(如索引)时,它会连同其相关数据一起永久删除。
因此,我们可以使用两种不同的 SQL DROP 查询从数据库表中删除任意索引。
重要的是要理解,删除索引可能会显著影响数据库查询的性能。因此,只有在确定不再需要该索引时才尝试删除它。
MySQL DROP INDEX 语句
MySQL 中的 DROP INDEX 语句用于从表中删除索引。
语法
以下是使用 DROP INDEX 语句删除索引的语法 −
DROP INDEX index_name ON table_name;
示例
在本示例中,我们首先创建一个名为 CUSTOMERS 的新表,并使用以下 CREATE TABLE 查询为其一列(AGE)添加索引 −
CREATE TABLE CUSTOMERS ( ID INT NOT NULL, NAME VARCHAR (20) NOT NULL, AGE INT NOT NULL, ADDRESS CHAR (25), SALARY DECIMAL (18, 2), PRIMARY KEY(ID), INDEX(AGE) );
现在,在 CUSTOMERS 表上创建另一个索引。这里我们使用 CREATE INDEX 语句 −
CREATE INDEX NAME_INDEX ON CUSTOMERS (Name);
DROP INDEX 查询 −
然后,使用以下查询删除上面创建的索引。
DROP INDEX NAME_INDEX ON CUSTOMERS;
验证
要验证索引是否已被删除,可以使用下面的 DESC 查询显示表定义 −
DESC CUSTOMERS;
从下面的表中可以看到,NAME 列上的索引已被删除。
| 字段 | 类型 | Null | 键 | 默认值 | 额外 |
|---|---|---|---|---|---|
| ID | int | NO | PRI | NULL | |
| NAME | varchar(20) | NO | NULL | ||
| AGE | int | NO | MUL | NULL | |
| ADDRESS | char(25) | YES | NULL | ||
| SALARY | decimal(18, 2) | YES | NULL |
MySQL ALTER... DROP 语句
ALTER DROP 语句也可以用于从 MySQL 表中删除索引。这是 DROP INDEX 语句的替代方法,因此它仅适用于表上存在的索引。
语法
以下是 SQL 中 DROP INDEX IF EXISTS 的语法 −
ALTER TABLE table_name DROP INDEX index_name;
示例
让我们看另一个示例,使用 ALTER... DROP 命令从 CUSTOMERS 表中删除索引,如下所示 −
ALTER TABLE CUSTOMERS DROP INDEX AGE;
验证
要验证 AGE 列上的索引是否已被删除,可以使用下面的 DESC 查询显示表定义 −
DESC CUSTOMERS;
从下面的表中可以看到,NAME 列上的索引已被删除。
| 字段 | 类型 | Null | 键 | 默认值 | 额外 |
|---|---|---|---|---|---|
| ID | int | NO | PRI | NULL | |
| NAME | varchar(20) | NO | NULL | ||
| AGE | int | NO | NULL | ||
| ADDRESS | char(25) | YES | NULL | ||
| SALARY | decimal(18, 2) | YES | NULL |
删除 PRIMARY KEY 或 UNIQUE 约束
MySQL 中的 DROP INDEX 语句通常不会删除像 PRIMARY KEY 或 UNIQUE 约束这样的索引。要删除与这些约束关联的索引,我们需要使用 ALTER TABLE DROP 命令。
语法
以下是语法 −
ALTER TABLE table_name DROP constraint_name;
示例
在本示例中,我们使用以下查询删除 CUSTOMERS 表 ID 列上的 PRIMARY KEY 约束 −
ALTER TABLE CUSTOMERS DROP PRIMARY KEY;
验证
要验证主键约束是否已从表中删除,可以使用 DESC 命令描述 'temp' 表,如下所示 −
DESC CUSTOMERS;
PRIMARY KEY 约束最终被删除了!查看下面的表 −
| 字段 | 类型 | Null | 键 | 默认值 | 额外 |
|---|---|---|---|---|---|
| ID | int | NO | NULL | ||
| NAME | varchar(20) | NO | NULL | ||
| AGE | int | NO | NULL | ||
| ADDRESS | char(25) | YES | NULL | ||
| SALARY | decimal(18, 2) | YES | NULL |
使用客户端程序删除索引
我们已经了解了如何使用 SQL 查询从 MySQL 数据库中删除索引。除此之外,我们还可以使用其他客户端程序在 MySQL 数据库中执行删除索引操作。
语法
以下是使用各种编程语言从 MySQL 数据库中删除索引的语法 −
MySQL PHP 连接器 mysqli 提供了一个名为 query() 的函数,用于在 MySQL 数据库中执行 DROP INDEX 查询。
$sql = "DROP INDEX index_name ON tbl_name"; $mysqli->query($sql);
MySQL NodeJS 连接器 mysql2 提供了一个名为 query() 的函数,用于在 MySQL 数据库中执行 DROP INDEX 查询。
sql= "DROP INDEX index_name ON tbl_name"; con.query(sql);
我们可以使用 JDBC type 4 驱动程序通过 Java 与 MySQL 通信。它提供了一个名为 executeUpdate() 的函数,用于在 MySQL 数据库中执行 DROP INDEX 查询。
String sql = "DROP INDEX index_name ON table_name"; statement.executeQuery(sql);
MySQL Connector/Python 提供了一个名为 execute() 的函数,用于在 MySQL 数据库中执行 DROP INDEX 查询。
drop_index_query = "DROP INDEX index_name ON tbl_name" cursorObj.execute(drop_index_query);
示例
以下是此操作在各种编程语言中的实现 −
$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = 'password';
$dbname = 'TUTORIALS';
$mysqli = new mysqli($dbhost, $dbuser, $dbpass, $dbname);
if ($mysqli->connect_errno) {
printf("Connect failed: %s
", $mysqli->connect_error);
exit();
}
// printf('Connected successfully.
');
// 删除索引
$sql = "DROP INDEX tid ON tutorials_table";
if ($mysqli->query($sql)) {
printf("Index droped successfully!.
");
}
if ($mysqli->errno) {
printf("Index could not be droped!.
", $mysqli->error);
}
$mysqli->close();
输出
获得如下输出 −
Index droped successfully!.
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 temp(ID INT, Name VARCHAR(255), age INT, Location VARCHAR(255));"
con.query(sql);
sql = "INSERT INTO temp values(1, 'Radha', 29, 'Vishakhapatnam'),(2, 'Dev', 30, 'Hyderabad');"
con.query(sql);
//创建索引
sql = "CREATE INDEX sample_index ON temp (name) USING BTREE;"
con.query(sql);
sql = "CREATE INDEX composite_index on temp (ID, Name);"
con.query(sql);
//显示索引
sql = "SHOW INDEXES FROM temp;"
con.query(sql, function(err, result){
if (err) throw err
console.log(result);
console.log("--------------------------");
});
//删除索引
sql = "DROP INDEX sample_index ON temp;"
con.query(sql);
sql = "DROP INDEX composite_index ON temp;"
con.query(sql);
//删除后显示索引
sql = "SHOW INDEXES FROM temp;"
con.query(sql, function(err, result){
if (err) throw err
console.log(result);
});
});
输出
产生的输出如下 −
Connected!
--------------------------
[
{
Table: 'temp',
Non_unique: 1,
Key_name: 'sample_index',
Seq_in_index: 1,
Column_name: 'Name',
Collation: 'A',
Cardinality: 2,
Sub_part: null,
Packed: null,
Null: 'YES',
Index_type: 'BTREE',
Comment: '',
Index_comment: '',
Visible: 'YES',
Expression: null
},
{
Table: 'temp',
Non_unique: 1,
Key_name: 'composite_index',
Seq_in_index: 1,
Column_name: 'ID',
Collation: 'A',
Cardinality: 2,
Sub_part: null,
Packed: null,
Null: 'YES',
Index_type: 'BTREE',
Comment: '',
Index_comment: '',
Visible: 'YES',
Expression: null
},
{
Table: 'temp',
Non_unique: 1,
Key_name: 'composite_index',
Seq_in_index: 2,
Column_name: 'Name',
Collation: 'A',
Cardinality: 2,
Sub_part: null,
Packed: null,
Null: 'YES',
Index_type: 'BTREE',
Comment: '',
Index_comment: '',
Visible: 'YES',
Expression: null
}
]
--------------------------
[]
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class DropIndex {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/TUTORIALS";
String username = "root";
String password = "password";
try {
Class.forName("com.mysql.cj.jdbc.Driver");
Connection connection = DriverManager.getConnection(url, username, password);
Statement statement = connection.createStatement();
System.out.println("Connected successfully...!");
//删除索引
String sql = "DROP INDEX tid ON tutorials_tbl";
statement.executeUpdate(sql);
System.out.println("Index has been dropped Successfully...!");
connection.close();
} catch (Exception e) {
System.out.println(e);
}
}
}
输出
获得的输出如下所示 −
Connected successfully...! Index has been dropped Successfully...!
import mysql.connector
#建立连接
connection = mysql.connector.connect(
host='localhost',
user='root',
password='password',
database='tut'
)
cursorObj = connection.cursor()
drop_index_query = "DROP INDEX idx_submission_date ON tutorials_tbl"
cursorObj.execute(drop_index_query)
connection.commit()
print("Index dropped successfully.")
cursorObj.close()
connection.close()
输出
以上代码的输出如下 −
Index dropped successfully.