2

良い説明を探していましたが、満足のいくものは見つかりませんでした。

私はこのテーブルを持っています

テーブルメール

CREATE TABLE `emails` (
  `UrlId` int(11) NOT NULL,
  `EmailAddress` varchar(100) NOT NULL,
  UNIQUE KEY `UrlId_UNIQUE` (`UrlId`,`EmailAddress`),
  CONSTRAINT `FK_UrlId_EmailAdress` FOREIGN KEY (`UrlId`) REFERENCES `urls` (`UrlId`) 
  ON DELETE CASCADE ON UPDATE NO ACTION
  ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

このクエリを実行すると

SELECT count(*) '# of tables',
concat(round(sum(table_rows)/1000000,2),'M') '# of rows',
concat(round(sum(data_length)/(1024*1024*1024),2),'G') 'Size of data',
concat(round(sum(index_length)/(1024*1024*1024),2),'G') 'Size of index',
concat(round(sum(data_length+index_length)/(1024*1024*1024),2),'G') 'Total size',
round(sum(index_length)/sum(data_length),2) 'Index fraction'
FROM information_schema.TABLES WHERE table_name='emails';

私はこの結果を得る

# of tables, # of rows, Size of data, Size of index, Total size, Index fraction
1            1.52M      0.17G         0.00G          0.17G       0.00

テーブルには 150 万行を超える行がありますが、インデックス サイズは 0 です。

それから私はこのテーブルを持っています

CREATE TABLE `search_tags` (
  `TagId` int(11) NOT NULL,
  `UrlId` int(11) NOT NULL,
  UNIQUE KEY `Unique_UrlId_SearchTagId` (`UrlId`,`TagId`),
  UNIQUE KEY `Unique_SearchTagId_UrlId` (`TagId`,`UrlId`),
  CONSTRAINT `SearchTagId` FOREIGN KEY (`TagId`) REFERENCES `search_tag` (`SearchTagId`) 
  ON DELETE CASCADE ON UPDATE NO ACTION,
  CONSTRAINT `UrlId` FOREIGN KEY (`UrlId`) REFERENCES `urls` (`UrlId`) 
  ON DELETE CASCADE ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

そのテーブルでチェックアップクエリを実行すると、これが得られます

# of tables, # of rows, Size of data, Size of index, Total size, Index fraction
1            77.06M     3.01G         1.36G          4.37G       0.45

ご覧のとおり、search_tags テーブルに 2 つの一意のインデックスがあります。これは実際にはインデックスサイズを示しています。

インデックスのサイズがemails0 になっているのはなぜですか? 一意なので、実際のデータもインデックスですか?search_tagsにインデックス サイズがあるのはなぜですか? 二重のインデックスがあり、一意のデータの側に 1 つのインデックスが作成されるためですか? それとも私は道を外れていますか?

編集

search_tags一意のインデックスが 1 つだけのテスト テーブルを作成することにしました。そして結果は予想通り。

# table_name       # of rows  Size of data  Size of index  Total size  Index fraction
search_tags        74.96M     3.01G         1.36G          4.37G       0.45
search_tags_test   67.92M     1.81G         0.00G          1.81G       0.00

テーブル列全体をカバーする一意のインデックスは、データ全体がインデックスになるため、インデックス サイズは 0 であると言っても過言ではありません。

しかし、私は過去に「言うのは安全だ」と言いました...そして私の仮定に100%確信があり、後でそれが正しくないことがわかりました。これを他の人に確認してもらいたいだけです。

4

1 に答える 1

0

InnoDBエンジンの説明の一部のようです:

InnoDB テーブルは、主キーに基づいて一般的なクエリを最適化するために、ディスク上のデータを整理します。各 InnoDB テーブルには、クラスター化インデックスと呼ばれる主キー インデックスがあり、主キー ルックアップの I/O を最小限に抑えるためにデータを編成します。

于 2013-11-04T15:21:00.633 に答える