MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLでテーブルをTRUNCATEした場合、インデックスを再作成する必要はある?

結論:TRUNCATE後もインデックスを再追加する必要はありません

MySQLでTRUNCATE TABLEを実行した場合、インデックスを改めて追加し直す必要はありません。これは、TRUNCATE処理によってテーブルが内部的に再作成される際、定義されていたインデックスも自動的に復元されるためです。

以下では、実際にテーブルを作成してインデックスを設定し、TRUNCATE前後でテーブル定義を比較することで、この動作を順を追って確認していきます。

1. サンプルテーブルを作成する

まず、以下のクエリでテーブルを作成します。

mysql> create table DemoTable
    -> (
    -> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> FirstName varchar(20),
    -> LastName varchar(20)
    -> );
Query OK, 0 rows affected (0.65 sec)

2. インデックスを作成する

続いて、FirstNameカラムとLastNameカラムに対して複合インデックスを作成します。

mysql> create index Index_firstName_LastName on DemoTable(FirstName,LastName);
Query OK, 0 rows affected (1.04 sec)
Records: 0 Duplicates: 0 Warnings: 0

3. レコードを挿入する

INSERTコマンドを使って、テーブルにレコードを追加します。

mysql> insert into DemoTable(FirstName,LastName) values('John','Smith');
Query OK, 1 row affected (0.47 sec)

4. レコードを確認する

SELECT文でテーブル内の全レコードを表示します。

mysql> select *from DemoTable;

出力結果

上記のSELECT文を実行すると、次のような出力が得られます。

+----+-----------+----------+
| Id | FirstName | LastName |
+----+-----------+----------+
|  1 | John      | Smith    |
+----+-----------+----------+
1 row in set (0.00 sec)

5. TRUNCATE前にテーブル定義を確認する

テーブルをTRUNCATEする前に、SHOW CREATE TABLEで現在のテーブル定義を確認しておきましょう。

mysql> show create table DemoTable;

出力結果

出力を見ると、主キー(Id)に加えて、「Index_firstName_LastName」という複合インデックスが定義されていることがわかります。

+--------------+------------------------------------------------------------------
| Table        | Create Table
+--------------+------------------------------------------------------------------
| DemoTable    | CREATE TABLE `DemoTable` (`Id` int(11) NOT NULL AUTO_INCREMENT,
`FirstName` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
`LastName` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (`Id`),KEY `Index_firstName_LastName` (`FirstName`,`LastName`))
ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |
+--------------+------------------------------------------------------------------
1 row in set (0.00 sec)

6. テーブルをTRUNCATEする

次のコマンドでテーブルを切り捨てます。

mysql> truncate table DemoTable;
Query OK, 0 rows affected (2.01 sec)

7. TRUNCATE後にテーブル定義を再確認する

TRUNCATE後にもう一度テーブル定義を確認してみましょう。インデックスを追加し直す必要はありません。

mysql> show create table DemoTable;

出力結果

実行すると、次のような出力が得られます。

+--------------+------------------------------------------------------------------
| Table        | Create Table
+--------------+------------------------------------------------------------------
| DemoTable    | CREATE TABLE `DemoTable` (`Id` int(11) NOT NULL AUTO_INCREMENT,
`FirstName` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
`LastName` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (`Id`),KEY `Index_firstName_LastName` (`FirstName`,`LastName`))
ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |
+--------------+------------------------------------------------------------------
1 row in set (0.00 sec)

まとめ

TRUNCATE後のSHOW CREATE TABLEの出力には「KEY `Index_firstName_LastName` (`FirstName`,`LastName`)」が引き続き含まれており、インデックスが自動的に維持されていることが確認できます。

TRUNCATE TABLEは単にデータを削除するだけでなく、テーブル自体を再作成する処理です。その際、元のテーブル定義(主キーやインデックスを含む)がそのまま適用されるため、ユーザーが手動でインデックスを再作成する必要はありません。なお、AUTO_INCREMENTの連番値もリセットされる点は、WHERE句なしのDELETE文との大きな違いです。用途に応じて両者を適切に使い分けるとよいでしょう。

  1. Gmailのメール本文に直接表(テーブル)を挿入する2つの簡単な方法

    同僚にメールで表を送りたい——でも表自体は小さくて、わざわざスプレッドシートを添付するのは大げさに感じる。そんな場面に遭遇したことはありませんか?実は、この問題には簡単な解決策が2つあります。GoogleスプレッドシートまたはMicrosoft Excelを使えば、添付ファイルなしでGmailのメール本文に直接表を挿入できるのです。GoogleスプレッドシートでGmail用の表を作成する方法Gmail単体では表を作成できませんが、Googleスプレッドシートと組み合わせれば、自分で作った表をそのままメールに貼り付けることができます。Googleスプレッドシートを使ったことがない方も、操作はとて

  2. Wordで目次を追加する方法|自動目次の作成・更新・カスタマイズ手順を解説

    Word文書に目次を追加する方法をお探しですか?この記事では、Microsoft Wordで自動目次を作成する手順を、初心者の方にもわかりやすく解説します。何十ページにも及ぶ長い文書を作成した後は、読者が目的の章や節にすぐアクセスできるように工夫することが大切です。しかし、ページ数が多く、章や小見出しがたくさんある場合、各章のタイトルとページ番号を手動で入力するのは非効率的ですし、内容を編集するたびに番号がずれて修正が必要になります。そこで活用したいのが「自動目次」機能です。執筆作業に集中しながら、常に正確な目次を簡単に維持できます。目次(Table of Contents、略してTOCとも呼