質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

Q&A

1回答

4290閲覧

InnoDBテーブルにオーバーヘッドが発生する原因がわかりません

zico_teratail

総合スコア907

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

0グッド

0クリップ

投稿2017/01/20 01:19

MySQLでサイトへのアクセスログを取るテーブルを作りました。
ここに実際のログデータが入ると、なぜかオーバーヘッドが発生します。
phpMyAdminでの表示は以下の通りです。

ディスク使用量
種別 使用量
データ 1,552.0 KiB
インデックス 0 バイト
オーバーヘッド 4,096.0 KiB
実効 -2,605,056 バイト
合計 1,552.0 KiB

「実効」がマイナス値というのも理解不能です。

テーブルの構造は以下の通りです。

sql

1-- サーバのバージョン: 5.5.45 2-- PHP のバージョン: 5.3.3 3CREATE TABLE IF NOT EXISTS `log` ( 4 `no` int(11) unsigned NOT NULL AUTO_INCREMENT, 5 `uri` varchar(50) NOT NULL, 6 `ip` varchar(48) NOT NULL, 7 `ua` varchar(300) NOT NULL, 8 `create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 9 `ref` varchar(100) NOT NULL, 10 PRIMARY KEY (`no`) 11) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=3602 ;

同じDB内の他のテーブルには問題なく、このlogテーブルだけオーバーヘッドが発生します。

何が原因だと考えられるでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

なんか軽い気持ちでぐぐったら中々コレっていうのにヒットしなくて苦戦しました。笑

StackOverflow - How do I reduce MySQL's overhead as displayed in phpMyAdmin?


PHPMyAdminで表示されるオーバヘッドは、SHOW TABLE STATUSData_freeカラムから得られる情報を元に計算されています。このことはMySQLのドキュメントに明記されています:
http://dev.mysql.com/doc/refman/5.1/en/show-table-status.html

Data_free:確保されたが未使用のバイト数

Beginning with MySQL 5.1.24, this information is also shown for InnoDB tables (previously, it was in the Comment value). InnoDB tables report the free space of the tablespace to which the table belongs. For a table located in the shared tablespace, this is the free space of the shared tablespace. If you are using multiple tablespaces and the table has its own tablespace, the free space is for only that table. Free space means the number of completely free 1MB extents minus a safety margin. Even if free space displays as 0, it may be possible to insert rows as long as new extents need not be allocated.

この記述の中で重要なのは「InnoDbテーブルは所属しているテーブルスペースの空きスペースを表示します。共有テーブルスペースに作られたテーブルにとっては、これは共有テーブルスペースの空きスペースです。」という部分です。普通のInnoDbの設定では(innodb_file_per_tableが設定されていない)単一のテーブルではなく全テーブルの空きスペースを取ってきてしまいます。(省略)


とあるので、他のテーブルの実装では共有空きスペースが発生しない定義だったのではないでしょうか。
(MySQL使ったことないので分かりませんが直観的には文字列やBLOB型が無い、とか。)
英語が読めるなら原文の方に行けばInnoDbの調整方法へのリンク等もあったのでそちらを参照してみては如何でしょうか。

余談ですが、Effectiveの列の値がマイナスの件については別の質問で以下のように回答されています。


その表示はマイナスじゃなくて「だいたい~」という意味を表すチルドです。
InnoDBは正確な行数を管理していないのでテーブルの大まかな行数を表示しています。
COUNT(*)メソッドを使えば正確な行数が取得できます。


とあります。

投稿2017/01/20 03:05

haru666

総合スコア1591

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

zico_teratail

2017/01/20 03:50

ありがとうございます。 なかなか難しそうな内容ですね。 >他のテーブルの実装では共有空きスペースが発生しない定義だったのではないでしょうか 他のテーブルにもvarcharなどがありますが、オーバーヘッドは発生していません。 >その表示はマイナスじゃなくて「だいたい~」という意味を表すチルド いえ、実効欄に表示されているのはチルダではなくマイナスです。 phpMyAdminでInnoDBテーブルでの「表示」を選択したときに、 表示中の列 0 - 29 (~3,619 合計, クエリの実行時間 0.0004 秒) と出てくるのはチルダですけどね。
haru666

2017/01/20 04:47

ああ、Effective関係なかったですね… Effective検索しても全然見つからないんですよね、う~ん とりあえずオーバーヘッド自体は即座に遅くなるとかそういった類のものではないので、気になるならテーブルスペースについて調べなおすことですかね Effectiveがマイナスの値っていうのはよく見るんですが、不思議と質問が見つからないので、何かドキュメントに数字の意味について書いてませんかね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問