以下は、私の mysql DB の 2 つのテーブルの行の量です
。1 つは myisam、もう 1 つは innodb です。
innodbの番号の前に~がある理由を誰か教えてもらえますか?
これらの数値はphpmyadminからのものです
10,308 MyISAM
~118,011 InnoDB
phpMyAdmin はSHOW TABLE STATUS
、テーブルの情報を取得するために使用します。
ドキュメントから:
行
行数。MyISAM などの一部のストレージ エンジンは、正確な数を保存します。InnoDB などの他のストレージ エンジンの場合、この値は概算値であり、実際の値とは 40 ~ 50% ほど異なる場合があります。このような場合は、SELECT COUNT(*) を使用して正確なカウントを取得します。
これは、InnoDB がACID準拠のストレージ エンジンであるためです。InnoDB は、行レベルロックを使用してMVCCを実装します。つまり、特定の時間に特定の行の複数のコピーが存在する可能性があります。この記事を読むことをお勧めします: InnoDB MVCC を理解する。
InnoDB はトランザクション ストレージ エンジンであるため、正確な数は解釈の対象となります。たとえば、一部の行がストレージに存在する可能性がありますが、それらの行を作成したトランザクションはまだコミットされていません。したがって、行はカウントに含めるべきではありません。
さらに紛らわしいことに、トランザクションがREPEATABLE READ
分離レベルである可能性があります。これは、トランザクションが開始される前にコミットされた行のみが表示されることを意味します。一部の行がコミットされる可能性がありますが、繰り返し可能な読み取りトランザクションの開始よりも最近です。したがって、これらの行もカウントに含めるべきではありません。ただし、後で開始された別のトランザクションまたはREAD COMMITTED
分離レベルで行われたカウントには、同じ行が含まれています。
これが、InnoDB のこのテーブル統計が概算しかできない理由です。正確な数を得るには、保存されているすべての行をスキャンして、それらが現在のトランザクションに表示されるかどうかを確認する必要があります。