web-dev-qa-db-ja.com

主キーで一意のインデックスを使用することでパフォーマンスに違いはありますか?

私はこれと同様の質問が失われていることを知っていますが、実際にこれに答えるものはありません:

MySQL 5.5を実行しているサーバーでMyISAMテーブルを使用して、主キーで一意のインデックスを使用する場合、パフォーマンスに違いはありますか?

さらに情報が必要な場合は、すべてご提供いたします。
その変更を行うだけの価値があるかどうか(「シーク」時間が5ミリ秒を超えて減少した場合など)、または恐ろしい犯罪を犯しているかどうかを知りたいだけです。

そして、はい、これは深刻な問題です。

5
Ismael Miguel

PRIMARY KEYは、定義により、UNIQUEおよびNOT NULLなので、2つ目のUNIQUEキーワードを追加すると、実際には別のインデックスが作成されます。これにより、効率が低下するだけでなく、クエリのパフォーマンスが低下する場合があります。

次のようにして、2つのインデックスが作成されたことを確認できます。

mysql> SHOW CREATE TABLE test\G
*************************** 1. row ***************************
       Table: test
Create Table: CREATE TABLE `test` (
  `id` int(11) NOT NULL,
  `c` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

MyISAMとInnoDBの両方で、追加のスペースが必要になり、書き込みが遅くなります(インデックスは書き込み時に同期的に更新する必要があるため)。最適なインデックスを決定するオプティマイザ(マイクロ秒でも)の時間が無駄になる可能性があります。 。 MySQLは通常MyISAMのPRIMARYキーを選択しますが、何らかの理由で両方のインデックスが使用された場合、メモリも浪費します。

私を信じていない場合は、MySQLを信じてください。

mysql> INSERT test1 SELECT * from test;
Query OK, 1691648 rows affected (6.84 sec)
Records: 1691648  Duplicates: 0  Warnings: 0

mysql> create table test2 like test1;
Query OK, 0 rows affected (0.04 sec)

mysql> ALTER TABLE test2 add unique(id);
Query OK, 0 rows affected, 1 warning (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 1

mysql> INSERT test2 SELECT * from test;
Query OK, 1691648 rows affected (10.94 sec)
Records: 1691648  Duplicates: 0  Warnings: 0

pt-duplicate-key-checker を実行するだけで、通常、これらの重複を検出できます。

UNIQUE NOT NULLの代わりにPRIMARY KEY、ほとんどの場合、MyISAMでの違いは期待できません(ただし、行ベースのレプリケーションなど、一部のツールはPKでより適切に機能します)。 InnoDBでは、PKがその構造(その周りのクラスター化された行)の基本である場合とは異なります。

7
jynus