少し前に、mysql db のクエリを最適化し始めました。いくつかのインデックスを作成し、show index from syntax を使用してそれらのパラメーターを表示することにしました。また、カーディナリティが一部の列の個別のカウントと一致しないことがわかりました。
だから、私はテーブルを持っています
CREATE TABLE `item_owners` (
`uid` varchar(255) NOT NULL,
`version` bigint(20) NOT NULL,
`type_id` varchar(255) NOT NULL,
`owner_name` varchar(255) NOT NULL,
`item_id` varchar(255) NOT NULL,
`status_id` varchar(255) NOT NULL,
PRIMARY KEY (`uid`),
KEY `FK181EADBC7346EE24` (`status_id`),
KEY `FK181EADBC90094D43` (`type_id`),
KEY `FK181EADBC499E38CA` (`item_id`),
CONSTRAINT `FK181EADBC499E38CA` FOREIGN KEY (`item_id`) REFERENCES `items` (`uid`),
CONSTRAINT `FK181EADBC7346EE24` FOREIGN KEY (`status_id`) REFERENCES `statuses` (`uid`),
CONSTRAINT `FK181EADBC90094D43` FOREIGN KEY (`type_id`) REFERENCES `types` (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
そして、そのテーブルには2M行(実際には2Mのuniq PK)、500kのuniq item_id、5つのuniq status_id、および20のuniq type_idがあります
しかし、私が実行すると
show index from item_owners
私が持っている
+-------------+------------+--------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------------+------------+--------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| item_owners | 0 | PRIMARY | 1 | uid | A | 1893427 | NULL | NULL | | BTREE | | |
| item_owners | 1 | FK181EADBC7346EE24 | 1 | status_id | A | 17 | NULL | NULL | | BTREE | | |
| item_owners | 1 | FK181EADBC90094D43 | 1 | type_id | A | 17 | NULL | NULL | | BTREE | | |
| item_owners | 1 | FK181EADBC499E38CA | 1 | item_id | A | 148000 | NULL | NULL | | BTREE | | |
+-------------+------------+--------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
それから私は実行することにしました
analyze table item_owners
そして、この出力の後:
+-------------+------------+--------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------------+------------+--------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| item_owners | 0 | PRIMARY | 1 | uid | A | 2005419 | NULL | NULL | | BTREE | | |
| item_owners | 1 | FK181EADBC7346EE24 | 1 | status_id | A | 17 | NULL | NULL | | BTREE | | |
| item_owners | 1 | FK181EADBC90094D43 | 1 | type_id | A | 17 | NULL | NULL | | BTREE | | |
| item_owners | 1 | FK181EADBC499E38CA | 1 | item_id | A | 2005419 | NULL | NULL | | BTREE | | |
+-------------+------------+--------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
誰がそれがどのように可能か知っていますか? 、なぜカーディナリティが PK インデックスの場合でも一意の行数と等しくないのかを本当に誤解しているためです。