DBチューニング(2)

クラスタインデックス

''InnoDB''において''プライマリキー''を設定したテーブルには''クラスタインデックス''と呼ばれる特別なインデックスを持ちます。

主キーのインデックスは集合インデックスになります。

これをテストしたいと思います。

テスト用データを準備

次のようなtable01とtable02を作成しました。

CREATE TABLE `table01` (
  `id` int(11) DEFAULT NULL,
  `name` varchar(50) DEFAULT NULL,
  `description` varchar(1000) DEFAULT NULL,
  `dummy_text` varchar(5000) DEFAULT NULL
);

CREATE TABLE `table02` (
  `id` int(11) NOT NULL,
  `name` varchar(50) DEFAULT NULL,
  `description` varchar(1000) DEFAULT NULL,
  `dummy_text` varchar(5000) DEFAULT NULL,
  PRIMARY KEY (`id`)
);


テストデータを1,000,000件ずつインサートします。

id name description
1〜1000 ランダムな英文字 ランダムな英文字

テストデータ作成スクリプト

% mkdir ~/db_tune
% vi create_testdata.pl
#!/usr/bin/perl
use strict;
use warnings;
use Perl6::Say;

my @names = qw/
Neil
Gary
Lucas
Rudyard
Fitzgerald
Todd
Keith
Wing
Davis
Nasim
Zeph
Ivor
/;

my @descs = (
'ultrices a, auctor non, feugiat nec, diam. Duis mi enim,',
'pellentesque eget, dictum placerat, augue. Sed molestie. Sed id risus',
'eu neque pellentesque massa lobortis ultrices. Vivamus rhoncus. Donec est.',
'elit. Curabitur sed tortor. Integer aliquam adipiscing lacus. Ut nec',
'ullamcorper. Duis cursus, diam at pretium aliquet, metus urna convallis',
'erat eget ipsum. Suspendisse sagittis. Nullam vitae diam. Proin dolor.',
'nec, cursus a, enim. Suspendisse aliquet, sem ut cursus luctus,',
'arcu. Sed eu nibh vulputate mauris sagittis placerat. Cras dictum',
);

say "BEGIN";
say "DROP TABLE table01;";
say "DROP TABLE table02;";

say "CREATE TABLE `table01` ( id int(11) DEFAULT NULL, name varchar(50) DEFAULT NULL, description varchar(1000) );";
say "CREATE TABLE `table02` ( id int(11) NOT NULL, name varchar(50) DEFAULT NULL, description varchar(1000),   PRIMARY KEY (`id`) );";


for my $count ( 1 .. 1_000_000 ) {
#for my $count ( 1 .. 10 ) {
    my $name = $names[int rand @names];
    my $word = $descs[int rand @descs];

    say "INSERT INTO `table01` ( id, name, description ) values ( $count, '$name', '$word' );";
    say "INSERT INTO `table02` ( id, name, description ) values ( $count, '$name', '$word' );";

}

say "COMMIT";