天天看點

MySQL資料删除:如何在不同情況下使用DELETE、TRUNCATE和DROP

作者:程式員的秃頭之路

MySQL 中用于删除資料的方式主要有三種:DELETE、TRUNCATE 和 DROP。下面分别對這三種方式進行介紹和對比。

1、DELETE

DELETE 是 MySQL 中用于删除表中記錄的 SQL 語句。DELETE 可以根據 WHERE 子句指定的條件删除表中的特定記錄。如果沒有指定 WHERE 子句,則會删除表中的所有記錄。

原理: 當執行 DELETE 語句時,MySQL 會逐行檢查表中的記錄,并根據 WHERE 子句指定的條件删除符合條件的記錄。對于每個被删除的記錄,MySQL 會生成一條日志記錄(在 InnoDB 存儲引擎中為 Undo Log,以支援事務復原和鎖定控制)。

示例:

DELETE FROM employees WHERE age > 60;           

這個示例中,DELETE 語句會删除 employees 表中 age 大于 60 的記錄。

在不同的存儲引擎中,DELETE 的行為可能有所不同:

1、 InnoDB 存儲引擎: InnoDB 是一種事務安全的存儲引擎,是以 DELETE 操作會生成相應的 Undo Log,以支援事務復原和鎖定控制。在執行 DELETE 語句時,InnoDB 會為每個被删除的記錄添加一條日志記錄,并将其與事務關聯。如果事務送出,則删除操作生效;如果事務復原,則删除操作被撤銷。

2、 MyISAM 存儲引擎: MyISAM 不支援事務,是以 DELETE 操作在 MyISAM 表中是不可復原的。當執行 DELETE 語句時,MyISAM 會立即删除符合條件的記錄,并更新表的中繼資料。由于 MyISAM 使用表鎖,DELETE 操作可能會導緻其他查詢在表被鎖定期間等待。

需要注意的是,在使用 DELETE 删除大量資料時,可能會導緻資料庫的性能下降,因為 DELETE 會逐行删除記錄并生成相應的日志。在這種情況下,可以考慮使用 TRUNCATE 或者 DROP 語句,這兩個指令會更快地删除表中的所有資料。但它們不支援條件删除,也不支援復原。

2、TRUNCATE

TRUNCATE 是 MySQL 中用于快速删除表中所有記錄的 SQL 語句。與 DELETE 不同,TRUNCATE 會删除表中所有資料,但保留表結構(包括列名和資料類型)。TRUNCATE 是一個 DDL(資料定義語言)操作,是以執行速度相對較快,但不支援復原。

原理: 當執行 TRUNCATE 語句時,MySQL 會重置表的存儲空間,釋放表中所有資料,同時保留表結構。這種操作方式比 DELETE 更快,因為 TRUNCATE 不需要逐行檢查和删除記錄,也不需要生成 Undo Log。此外,TRUNCATE 會重置表的 AUTO_INCREMENT 計數器。

示例:

TRUNCATE TABLE employees;           

這個示例中,TRUNCATE 語句會删除 employees 表中的所有記錄,但保留表結構。

在不同的存儲引擎中,TRUNCATE 的行為可能有所不同:

1、 InnoDB 存儲引擎: 在 InnoDB 存儲引擎中,TRUNCATE 操作被實作為 DROP TABLE 和 CREATE TABLE 的組合操作。這意味着,當執行 TRUNCATE 時,InnoDB 會先删除原有表,然後重新建立一個新表,進而實作快速删除資料的目的。由于 TRUNCATE 是一個 DDL 操作,是以它不會生成 Undo Log,也不支援復原。

2、 MyISAM 存儲引擎: 在 MyISAM 存儲引擎中,TRUNCATE 會重置表的存儲空間,并将表的資料檔案大小重置為初始大小。與 InnoDB 類似,TRUNCATE 在 MyISAM 表中也是一個 DDL 操作,不支援復原。

需要注意的是,盡管 TRUNCATE 可以快速删除表中的所有資料,但它不支援條件删除,也不支援復原。在需要删除特定記錄或在事務中執行删除操作時,應使用 DELETE 語句。

3、DROP

DROP 是 MySQL 中用于删除整個表的 SQL 語句。執行 DROP 語句時,表中的資料以及表結構都會被删除。與 TRUNCATE 和 DELETE 不同,DROP 不僅删除表中的資料,還删除整個表結構。DROP 是一個 DDL(資料定義語言)操作,是以執行速度相對較快,但不支援復原。

原理: 當執行 DROP 語句時,MySQL 會從資料庫中删除指定的表,并釋放與表關聯的存儲空間和中繼資料。由于 DROP 是一個 DDL 操作,是以它不需要逐行删除記錄,也不需要生成 Undo Log。

示例:

DROP TABLE employees;           

這個示例中,DROP 語句會删除 employees 表及其結構。

在不同的存儲引擎中,DROP 的行為可能有所不同,但大緻過程相似:

1、 InnoDB 存儲引擎: 在 InnoDB 存儲引擎中,執行 DROP 語句時,MySQL 會從資料庫中删除指定的表,釋放與表關聯的存儲空間和中繼資料。InnoDB 的 DROP 操作也不支援復原,因為它屬于 DDL 操作。

2、 MyISAM 存儲引擎: 在 MyISAM 存儲引擎中,執行 DROP 語句時,MySQL 會删除表的資料檔案和索引檔案,同時從資料庫中繼資料中删除表的定義。與 InnoDB 類似,DROP 在 MyISAM 表中也是一個 DDL 操作,不支援復原。

需要注意的是,DROP 語句會永久删除表及其結構,是以在執行 DROP 語句之前,務必確定已備份好資料。另外,如果隻需要删除表中的資料而保留表結構,可以使用 TRUNCATE 語句。如果需要删除特定記錄或在事務中執行删除操作,應使用 DELETE 語句。

4、對比差別:

1、 DELETE 可以删除特定的記錄,而 TRUNCATE 和 DROP 删除整個表的資料。 2、 DELETE 支援 WHERE 子句,可以根據條件删除記錄;TRUNCATE 和 DROP 不支援條件删除。 3、 DELETE 是 DML(資料操作語言)操作,支援復原;而 TRUNCATE 和 DROP 是 DDL(資料定義語言)操作,不支援復原。 4、 DELETE 删除記錄時,會逐行進行,是以速度相對較慢;而 TRUNCATE 和 DROP 由于是DDL操作,速度較快。

5、速度差別:

在删除全部資料的情況下,TRUNCATE 和 DROP 的速度明顯快于 DELETE,因為 DELETE 會逐行删除記錄并生成相應的日志,而 TRUNCATE 和 DROP 通過重置表的結構來實作删除操作,不需要逐行處理。但是在删除特定記錄時,隻能使用 DELETE。

繼續閱讀