今度はブログ系のテーブル構成になっています。

サーバ環境

HP DL350
Linux version 2.6.9-5.ELsmp (bhcompile@decompose.build.redhat.com) (gcc version 3.4.3 20041212 (Red Hat 3.4.3-9.EL4)) #1 SMP Wed Jan 5 19:30:39 EST 2005

Intel(R) Pentium(R) III CPU family×2
cpu MHz : 1396.686
cache size : 512 KB
3GB of RAM

OSもMySQLも32bit。
MySQLは5.0.37。

1.テーブルの構造

1.1 InnoDBのテーブル
SQL:
  1. CREATE TABLE IF NOT EXISTS entry (
  2. `id`                         int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `status`                     NUMERIC(5)    NOT NULL,
  4. `category_id`                NUMERIC(10)   NOT NULL,
  5. `user_type`                  NUMERIC(10)   NOT NULL,
  6. `name`                       VARCHAR(64)   NOT NULL,
  7. `favorites`                  NUMERIC(10)   NOT NULL,
  8. `comments`                   NUMERIC(10)   NOT NULL,
  9. `trackbacks`                 NUMERIC(10)   NOT NULL,
  10. `comment_permission`         NUMERIC(10)   NOT NULL,
  11. `trackback_permission`       NUMERIC(10)   NOT NULL,
  12. `edited`                     DATETIME      NOT NULL,
  13. `image`                      NUMERIC(10)   NULL,
  14. `caption`                    VARCHAR(128)  NULL,
  15. `user_name`                  VARCHAR(64)   NOT NULL,
  16. `created`                    DATETIME      NOT NULL,
  17. `modified`                   DATETIME      NOT NULL,
  18. `removed`                    DATETIME      NULL,
  19. `title`                      VARCHAR(1000) NOT NULL,
  20. `body`                       TEXT          NULL,
  21. `comment_captcha_permission` NUMERIC(10)   NOT NULL DEFAULT 1,
  22. `favorite_permission`        NUMERIC(10)   NOT NULL DEFAULT 1,
  23. PRIMARY KEY  (`id`),
  24. UNIQUE INDEX `entry_unique` (`name`, `user_name`),
  25. INDEX `entry_idx1` (`user_name`,`status`,`edited`),
  26. INDEX `entry_idx2` (`name`,`user_name`,`removed`),
  27. INDEX `entry_idx3` (`edited`),
  28. INDEX `entry_idx4` (`trackbacks`,`edited`),
  29. INDEX `entry_idx5` (`comments`,`edited`),
  30. INDEX `entry_idx6` (`favorites`,`edited`),
  31. INDEX `entry_idx7` (`category_id`,`edited`),
  32. INDEX `entry_idx8` (`created`)
  33. )" ENGINE=innoDB;
  34. CREATE TABLE IF NOT EXISTS entry_comment (
  35. `id`                         int(10) unsigned NOT NULL auto_increment,
  36. `guest_name`                 VARCHAR(300)  null,
  37. `entry_id`                   NUMERIC(10)   not null,
  38. `user_name`                  VARCHAR(64)   null,
  39. `created`                    DATETIME      not null,
  40. `removed`                    DATETIME      null,
  41. `body`                       TEXT          null,
  42. `guest_url`                  VARCHAR(1000) null,
  43. PRIMARY KEY  (`id`),
  44. INDEX `entry_comment_idx1` (`entry_id`,`created`,`removed`),
  45. INDEX `entry_comment_idx2` (`user_name`,`removed`),
  46. INDEX `entry_comment_idx3` (`removed`,`created`),
  47. INDEX `entry_comment_idx4` (`user_name`)
  48. )"  ENGINE=innoDB;;

1.2 MyISAMのテーブル。
SQL:
  1. CREATE TABLE IF NOT EXISTS entry2 (
  2. `id`                         int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `status`                     NUMERIC(5)    NOT NULL,
  4. `category_id`                NUMERIC(10)   NOT NULL,
  5. `user_type`                  NUMERIC(10)   NOT NULL,
  6. `name`                       VARCHAR(64)   NOT NULL,
  7. `favorites`                  NUMERIC(10)   NOT NULL,
  8. `comments`                   NUMERIC(10)   NOT NULL,
  9. `trackbacks`                 NUMERIC(10)   NOT NULL,
  10. `comment_permission`         NUMERIC(10)   NOT NULL,
  11. `trackback_permission`       NUMERIC(10)   NOT NULL,
  12. `edited`                     DATETIME      NOT NULL,
  13. `image`                      NUMERIC(10)   NULL,
  14. `caption`                    VARCHAR(128)  NULL,
  15. `user_name`                  VARCHAR(64)   NOT NULL,
  16. `created`                    DATETIME      NOT NULL,
  17. `modified`                   DATETIME      NOT NULL,
  18. `removed`                    DATETIME      NULL,
  19. `title`                      VARCHAR(1000) NOT NULL,
  20. `body`                       TEXT          NULL,
  21. `comment_captcha_permission` NUMERIC(10)   NOT NULL DEFAULT 1,
  22. `favorite_permission`        NUMERIC(10)   NOT NULL DEFAULT 1,
  23. PRIMARY KEY  (`id`),
  24. UNIQUE INDEX `entry_unique` (`name`, `user_name`),
  25. INDEX `entry_idx1` (`user_name`,`status`,`edited`),
  26. INDEX `entry_idx2` (`name`,`user_name`,`removed`),
  27. INDEX `entry_idx3` (`edited`),
  28. INDEX `entry_idx4` (`trackbacks`,`edited`),
  29. INDEX `entry_idx5` (`comments`,`edited`),
  30. INDEX `entry_idx6` (`favorites`,`edited`),
  31. INDEX `entry_idx7` (`category_id`,`edited`),
  32. INDEX `entry_idx8` (`created`)
  33. )";
  34. CREATE TABLE IF NOT EXISTS entry_comment2 (
  35. `id`                         int(10) unsigned NOT NULL auto_increment,
  36. `guest_name`                 VARCHAR(300)  null,
  37. `entry_id`                   NUMERIC(10)   not null,
  38. `user_name`                  VARCHAR(64)   null,
  39. `created`                    DATETIME      not null,
  40. `removed`                    DATETIME      null,
  41. `body`                       TEXT          null,
  42. `guest_url`                  VARCHAR(1000) null,
  43. PRIMARY KEY  (`id`),
  44. INDEX `entry_comment_idx1` (`entry_id`,`created`,`removed`),
  45. INDEX `entry_comment_idx2` (`user_name`,`removed`),
  46. INDEX `entry_comment_idx3` (`removed`,`created`),
  47. INDEX `entry_comment_idx4` (`user_name`)
  48. )";

要するに同じ構造でInnoDB(テーブル名:entry,entry_comment)、MyISAM(テーブル名:entry2,entry_comment2)用のテーブルを作成しました。

entryとentry2は記事を格納するテーブルで100万件登録されています。
entry_commentとentry_comment2はコメントを格納するテーブルで、こちらも100万件登録されています。

PRIMARY KEYであるidには1~1000000の値がセットされています。
1記事に対して、1コメントが存在しています。

2.show indexの結果

SQL:
  1. mysql> SHOW INDEX FROM entry;
  2. +-------+------------+--------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
  3. | TABLE | Non_unique | Key_name     | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | NULL | Index_type | Comment |
  4. +-------+------------+--------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
  5. | entry |          0 | PRIMARY      |            1 | id          | A         |     1090408 |     NULL | NULL   |      | BTREE      |         |
  6. | entry |          0 | entry_unique |            1 | name        | A         |     1090408 |     NULL | NULL   |      | BTREE      |         |
  7. | entry |          0 | entry_unique |            2 | user_name   | A         |     1090408 |     NULL | NULL   |      | BTREE      |         |
  8. | entry |          1 | entry_idx1   |            1 | user_name   | A         |     1090408 |     NULL | NULL   |      | BTREE      |         |
  9. | entry |          1 | entry_idx1   |            2 | STATUS      | A         |     1090408 |     NULL | NULL   |      | BTREE      |         |
  10. | entry |          1 | entry_idx1   |            3 | edited      | A         |     1090408 |     NULL | NULL   |      | BTREE      |         |
  11. | entry |          1 | entry_idx2   |            1 | name        | A         |     1090408 |     NULL | NULL   |      | BTREE      |         |
  12. | entry |          1 | entry_idx2   |            2 | user_name   | A         |     1090408 |     NULL | NULL   |      | BTREE      |         |
  13. | entry |          1 | entry_idx2   |            3 | removed     | A         |     1090408 |     NULL | NULL   | YES  | BTREE      |         |
  14. | entry |          1 | entry_idx3   |            1 | edited      | A         |        4161 |     NULL | NULL   |      | BTREE      |         |
  15. | entry |          1 | entry_idx4   |            1 | trackbacks  | A         |     1090408 |     NULL | NULL   |      | BTREE      |         |
  16. | entry |          1 | entry_idx4   |            2 | edited      | A         |     1090408 |     NULL | NULL   |      | BTREE      |         |
  17. | entry |          1 | entry_idx5   |            1 | comments    | A         |     1090408 |     NULL | NULL   |      | BTREE      |         |
  18. | entry |          1 | entry_idx5   |            2 | edited      | A         |     1090408 |     NULL | NULL   |      | BTREE      |         |
  19. | entry |          1 | entry_idx6   |            1 | favorites   | A         |     1090408 |     NULL | NULL   |      | BTREE      |         |
  20. | entry |          1 | entry_idx6   |            2 | edited      | A         |     1090408 |     NULL | NULL   |      | BTREE      |         |
  21. | entry |          1 | entry_idx7   |            1 | category_id | A         |     1090408 |     NULL | NULL   |      | BTREE      |         |
  22. | entry |          1 | entry_idx7   |            2 | edited      | A         |     1090408 |     NULL | NULL   |      | BTREE      |         |
  23. | entry |          1 | entry_idx8   |            1 | created     | A         |        3894 |     NULL | NULL   |      | BTREE      |         |
  24. +-------+------------+--------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
  25. 19 rows IN SET (0.66 sec)
  26.  
  27. mysql> SHOW INDEX FROM entry_comment;
  28. +---------------+------------+--------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
  29. | TABLE         | Non_unique | Key_name           | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | NULL | Index_type | Comment |
  30. +---------------+------------+--------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
  31. | entry_comment |          0 | PRIMARY            |            1 | id          | A         |     1018735 |     NULL | NULL   |      | BTREE      |         |
  32. | entry_comment |          1 | entry_comment_idx1 |            1 | entry_id    | A         |     1018735 |     NULL | NULL   |      | BTREE      |         |
  33. | entry_comment |          1 | entry_comment_idx1 |            2 | created     | A         |     1018735 |     NULL | NULL   |      | BTREE      |         |
  34. | entry_comment |          1 | entry_comment_idx1 |            3 | removed     | A         |     1018735 |     NULL | NULL   | YES  | BTREE      |         |
  35. | entry_comment |          1 | entry_comment_idx2 |            1 | user_name   | A         |     1018735 |     NULL | NULL   | YES  | BTREE      |         |
  36. | entry_comment |          1 | entry_comment_idx2 |            2 | removed     | A         |     1018735 |     NULL | NULL   | YES  | BTREE      |         |
  37. | entry_comment |          1 | entry_comment_idx3 |            1 | removed     | A         |          18 |     NULL | NULL   | YES  | BTREE      |         |
  38. | entry_comment |          1 | entry_comment_idx3 |            2 | created     | A         |        3801 |     NULL | NULL   |      | BTREE      |         |
  39. | entry_comment |          1 | entry_comment_idx4 |            1 | user_name   | A         |     1018735 |     NULL | NULL   | YES  | BTREE      |         |
  40. +---------------+------------+--------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
  41. 9 rows IN SET (0.31 sec)

3.同時スレッドを2,4,8,16,32,64と変えながら1秒間のクエリー処理数を計測します。

4.60秒間事前に実行(アイドリング)してから、60秒3回計測してその平均を算出します。

5.MySQLの初期化パラメータは以下の通りです。

[mysqld]
port = 3306
socket = /tmp/mysql.sock
skip-locking

sort_buffer_size = 1M
read_buffer_size = 1M
read_rnd_buffer_size = 4M
myisam_sort_buffer_size = 64M
thread_cache_size = 1024
max_allowed_packet = 16M
key_buffer_size=1250M
innodb_buffer_pool_size=1250M
innodb_log_file_size=10M
innodb_thread_concurrency=8
max_connections=1500
table_cache=1024
net_read_timeout=30
net_write_timeout=30
back_log=128

※クエリーキャッシュを利用すると計測の意味が無くなってしまうので使用していません。

上記の内容で計測したのは
InnoDB vs MyISAM パフォーマンス比較 Left Join
InnoDB vs MyISAM パフォーマンス比較 Inner Join
InnoDB vs MyISAM パフォーマンス比較 副問い合わせ
です。