あなたはデータベースを削除することさえできないかもしれません。(delete、dropとtruncateはデータを削除します。)


前言
この二年間、IT業界の間違うところで、プログラマーがライブラリを削除するというニュースがあります。このようなデータベースを削除する行為は、被害会社に大きな損失を与え、ひいては一つの会社の倒産を招くこともあります。私たちプログラマーはこのようなニュースを見ると、かなりの部分が雑談の露店として扱われますが、読者の皆さんはこのような問題を考えていますか?ここを見て、読者がいると思いますが、削除庫は誰ができないですか?Delete以下ですか?そう思うなら、この文章を続けてみましょう。後の内容では、データベースのデータを削除する方法と原理を説明します。
MySQLにはデータを削除する方法が三つあります。それぞれdelete、drop、truncateです。この3つの方法は簡単ですが、背後の原理と注意事項は大部分の開発者がよく分かりません。以下の原理と注意事項を説明します。
一、delete
DeleteはデータベースDLL操作言語で、データを削除する時はデータだけを削除して、データ所在表のテーブル構造を削除しません。データを削除する時はトランザクションとトリガーを実行します。また、使用しているデータベースエンジンがInnoDBであれば、MySQLは削除データ操作を実行する際に削除済みとして表示していますので、データの削除は行っていません。この場合、Deleteを使ってデータを削除するとテーブルサイズは変わりません。
ただし、あなたのデータベースエンジンがMyISAMの場合はdelete from tableを実行します。  ステートメントは本当にテーブルのデータを削除して空間を解放します。MyISAMエンジンにもInnoDBエンジンのダミー削除の効果を実現したいなら、Delete文の後にWhere条件をつければいいです。例えばdelete from user where age<18この文の実行後の条件のデータは削除として表示されます。スペースは釈放されません。
この時、きっと鉄棒の精がある子供が言います。「InnoDBエンジンを使いたいです。削除されたデータに使われている空間を解放したいです。」この考え方はMySQLで解決策を提供してくれました。それはoptimize table文です。例を見てみます。Delete文で表のすべてのデータを削除してから、次の表の空間の大きさを確認します。

上の図から見れば、私たちはbookテーブルのすべてのデータを削除しましたが、このテーブルが占有している空間の大きさはほとんど変わっていません。この時、私達はoptimize table文を実行してから、再度テーブルの空間サイズを確認します。表の大きさは0.02 M Mになり、テーブル構造の大きさだけが残りました。

私達はDelete文でデータを削除する時に注意したいのは、delete操作は1行1行の実行です。そして、行ごとの削除ログをredoとundoテーブル空間に記録して、後のロールバックとやり直しをしやすくします。これによって大量のログが生まれ、さらに大量の空間を占有します。したがって、私たちはエントリでデータを大規模に削除する時、Delete文を使うことを勧めません。
Tip:ここに面白いところがあります。削除されたデータによって占有されている空間は解放されていませんが、Insert操作を実行すると、この部分が解放されていない空間は依然として再利用されます。
二、truncateとdrop
truncateはデータベースDDL言語であり、Deleteとの最大の違いは、トランザクションデータをロードしないし、rollback segmentにも入れないし、triggerもトリガしないので、truncate文を実行するとすぐに指定されたデータを削除して回復できなくなり、データが占有している空き間を解放します。truncate文は一般的に快速に空を確認するために使用され、aut_をリセットする必要があります。increment値の場合。
リセットについてaut_incrementの値は次の2点の注意が必要です。
  • は、InnoDBエンジンを使用する場合、truncate aut incrementを使用すると1にリセットされますが、deleteを使用すると、aut incrementは、MySQLを再開する前に現在の値を維持し、再起動値を1にリセットします。
  • は、MyISAMエンジンを使用する場合、truncate aut incrementを使用すると1にリセットされるが、deleteを使用すると、aut incrementは現在の値を維持している。
  • dropは同じデータベースDDL言語であり、truncateと同様に一旦実行すると、表と依存、触発器、インデックスは直ちに削除されますが、この表に関連する記憶プロセスと関数は保留され、状態をinvalidに変更されます。
    締め括りをつける
    表を中華まんにたとえるなら、デレーテは餡を饅頭から取り出して別の皿に置くことです。truncateは餡を中華まんから取り出して食べます。dropは肉まんをそのまま食べます。
    ライブラリを削除するスキルを習得しましたか?