MySQL重建索引
本篇文章介绍如何在 MySQL 中重建索引。
MySQL重建索引
MySQL 处理数据类型和字符,以便 MySQL 的索引或表可以发生变化。 这就是为什么有时我们需要重建 MySQL 中的索引。
重建索引的方法有几种,其中少数会修复或重建整个数据库或表,其中只有REINDEX是MySQL中的一种数据结构,只能用于重建索引。
我们可以使用 REINDEX 为一个或多个列重建索引,使表性能更好,访问数据更快。
每当数据库损坏或需要修复时,就需要使用 REINDEX 重建索引或修复数据库或表。
MySQL 的大部分索引,包括 PRIMARY KEY、UNIQUE、INDEX、FULLTEXT 和 REINDEX,都存储在 B 树中,B 树是一种自平衡数据结构树,以特定方式存储数据。
在使用 REINDEX 重建索引或重建数据库或表之前,我们首先需要创建一个包含表和索引的数据库。 本教程演示了用于在 MySQL 中重建索引的不同方法。
创建表和索引
现在让我们尝试一个使用 REINDEX 重建索引的例子,但在重建索引之前,我们首先必须创建索引,所以让我们从它开始。
-
首先,创建索引的语法是:
CREATE INDEX [IndexName] ON [TableName] ([ColumnName]);
-
现在,让我们创建一个表
create table Employee(id integer, name varchar(100), position varchar(100)); insert into Employee(id, name, position) values(1, "Sheeraz", "SeniorDeveloper"); insert into Employee(id, name, position) values(2, "John", "SeniorDeveloper"); insert into Employee(id, name, position) values(3, "Jack", "JuniorDeveloper"); select * from Employee;
id name position 1 Sheeraz SeniorDeveloper 2 John SeniorDeveloper 3 Jack JuniorDeveloper
-
对于 position,有不止一位 Senior Developer。 我们可以根据位置选择数据,也可以解释一下。看例子:
SELECT id, name FROM Employee WHERE Position= "SeniorDeveloper"; EXPLAIN SELECT id, name FROM Employee WHERE Position= "SeniorDeveloper";
id name 1 Sheeraz 2 John id select_type table partitions type possible_keys key key_len ref rows filtered Extra 1 SIMPLE Employee NULL ALL NULL NULL NULL NULL 3 33.33 Using where
-
现在,正如我们所见,表中有不止一位高级开发人员,因此我们为该列创建一个索引,然后解释上面的查询以查看不同之处。 看例子:
CREATE INDEX position ON Employee(Position); EXPLAIN SELECT id, name FROM Employee WHERE Position= "SeniorDeveloper";
id select_type table partitions type possible_keys key key_len ref rows filtered Extra 1 SIMPLE Employee NULL ref position position 403 const 1 100.00 NULL
SHOW INDEXES FROM Employee;
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment Visible Expression Employee 1 position 1 position A NULL NULL NULL YES BTREE YES NULL
使用 REINDEX 重建索引
现在,无论如何,如果在创建索引后,数据库或表损坏了,我们可以使用 REINDEX 重建索引,这将有助于我们减少内存并提高 IO 效率。
REINDEX 的语法是:
# To REINDEX the whole database
REINDEX DATABASE [DatabaseName];
# To REINDEX the Table
REINDEX TABLE [TableName];
# To REINDEX the Particular column
REINDEX TABLE [TableName]([ColumnName);
# To REINDEX the INDEX
REINDEX INDEX [Index_Name];
在这里,我们可以使用 REINDEX 或 OPTIMIZE 来重建损坏的索引。 看例子:
REINDEX TABLE Employee(position);
SHOW INDEXES FROM Employee;
或者
OPTIMIZE TABLE Employee;
SHOW INDEXES FROM Employee;
以上两个查询都将重建表的索引。
输出:
Table Op Msg_type Msg_text
test.Employee optimize status OK
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment Visible Expression
Employee 1 position 1 position A 1 NULL NULL YES BTREE YES NULL
使用 REPAIR TABLE 方法重建索引
除了 REINDEX,我们还可以修复整个表,这也会重建表中的索引。 有一个简单的查询来执行它。
REPAIR TABLE Employee;
SHOW INDEXES FROM Employee;
上面的代码会修复表,重建索引,然后显示索引的信息。 查看输出:
Table Op Msg_type Msg_text
test.Employee repair status OK
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment Visible Expression
Employee 1 position 1 position A 1 NULL NULL YES BTREE YES NULL
使用 InnoDB 的 ALTER TABLE 方法重建索引
我们还可以使用 ALTER TABLE 查询使用 InnoDB 引擎重建损坏的表和索引。 这是执行该操作的简单查询。
ALTER TABLE Employee ENGINE = InnoDB;
SHOW INDEXES FROM Employee;
该代码将使用 ALTER
使用 InnoDB 引擎重建表和索引。
输出:
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment Visible Expression
Employee 1 position 1 position A 2 NULL NULL YES BTREE YES NULL
相关文章
使用 Mysqldump 备份 MySQL 中的数据
发布时间:2023/05/09 浏览次数:192 分类:MySQL
-
本篇文章将介绍如何使用 mysqldump 只备份数据。 在这里,我们将探讨 --no-create-info 、--compact 、--skip-triggers 和 --no-create-db 选项。
更新 MySQL 表中的主键
发布时间:2023/05/09 浏览次数:61 分类:MySQL
-
本篇文章介绍如何更新 MySQL 表中的主键。 我们将使用 ALTER 命令对主键进行任何更改。更新 MySQL 表中的主键 我们可以在多种情况下更新 MySQL 表中的主键。
在 MySQL 中获取命令历史记录
发布时间:2023/05/09 浏览次数:150 分类:MySQL
-
本文重点介绍了在 Windows 和 Linux 中获取我们已执行的 MySQL 命令历史记录的各种方法。MySQL命令历史
Oracle 的 decode 函数在 MySQL 中的等价物
发布时间:2023/05/09 浏览次数:115 分类:MySQL
-
本篇文章介绍了三种替代实现,我们可以将它们用作 MySQL 中 Oracle 的 decode() 函数的等价物。 为此,我们将使用 IF()、CASE 以及 FIELD() 和 ELT() 的组合。
使用 Ubuntu 连接远程 MySQL 服务器的不同方法
发布时间:2023/05/09 浏览次数:97 分类:MySQL
-
在本文中我们将学习如何使用 Ubuntu 连接远程 MySQL 服务器来操作数据以及启动和停止 MySQL 服务器。
在 Linux 中安装 MySQL 客户端
发布时间:2023/05/09 浏览次数:72 分类:MySQL
-
在 Linux 中安装 MySQL 客户端的命令。Linux 和 Unix 等环境作为命令行界面工作,仅在命令的帮助下运行。
在 MySQL 中转换为十进制
发布时间:2023/05/09 浏览次数:150 分类:MySQL
-
有时,我们可能需要将一种数据类型转换为另一种数据类型。 下面是我们如何使用带有 DECIMAL(M,D) 的 CAST() 和 CONVERT() 函数在 MySQL 中转换为十进制。
在 MySQL 中获取当前日期和时间
发布时间:2023/05/09 浏览次数:145 分类:MySQL
-
本篇文章我们将学习 NOW()、CURRENT_TIMESTAMP()(也写为 CURRENT_TIMESTAMP)和 SYSDATE() 来获取 MySQL 中的当前日期和时间。 我们还将看到这三个功能之间的比较。在 MySQL 中获取当前日期和时间
更改 MySQL 服务器中的 max_allowed_packet Size
发布时间:2023/05/09 浏览次数:142 分类:MySQL
-
本篇文章介绍如何更改 MySQL 服务器中的 max_allowed_packet 大小。 为了了解这一点,我们将使用两个操作系统,Windows 10 和 Linux (Ubuntu)。