私はこれと同様の質問が失われていることを知っていますが、実際にこれに答えるものはありません:
MySQL 5.5を実行しているサーバーでMyISAMテーブルを使用して、主キーで一意のインデックスを使用する場合、パフォーマンスに違いはありますか?
さらに情報が必要な場合は、すべてご提供いたします。
その変更を行うだけの価値があるかどうか(「シーク」時間が5ミリ秒を超えて減少した場合など)、または恐ろしい犯罪を犯しているかどうかを知りたいだけです。
そして、はい、これは深刻な問題です。
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がその構造(その周りのクラスター化された行)の基本である場合とは異なります。