gpt4 book ai didi

MySQL 多个唯一键,缺点

转载 作者:行者123 更新时间:2023-11-29 00:22:03 35 4
gpt4 key购买 nike

创建一个包含字段 A、B、C 的唯一键然后创建另一个包含字段 C、B、A 的唯一键是否有缺点,因此 MySQL 将在仅使用 A 和仅使用 A 进行搜索的情况下利用索引C?

最佳答案

您不想创建额外的复合 UNIQUE 约束。现有索引 (a, b, c) 已经涵盖了仅通过 A 访问数据的情况。如果您需要支持仅通过 c 访问路径的查询,那么您可以仅在 c 上创建索引。

如果你的架构看起来像

mysql> create table tablex     -> (    ->   a int not null,     ->   b int not null,     ->   c int not null    -> );Query OK, 0 rows affected (0.03 sec)mysql> insert into tablex values (1, 2, 3),(2, 3, 4),(1, 3, 3);Query OK, 3 rows affected (0.01 sec)Records: 3  Duplicates: 0  Warnings: 0mysql> create unique index idx_abc_unique on tablex (a, b, c);Query OK, 0 rows affected (0.06 sec)Records: 0  Duplicates: 0  Warnings: 0

如果您只过滤 A,您会看到正确使用了唯一索引,因为 A 是最左边的前缀 (keylen = 4 ) 的索引。 EXPLAIN 结果中的 Extra 列显示 Using index

mysql> explain select * from tablex where a = 1;+----+-------------+--------+------+----------------+----------------+---------+-------+------+-------------+| id | select_type | table  | type | possible_keys  | key            | key_len | ref   | rows | Extra       |+----+-------------+--------+------+----------------+----------------+---------+-------+------+-------------+|  1 | SIMPLE      | tablex | ref  | idx_abc_unique | idx_abc_unique | 4       | const |    1 | Using index |+----+-------------+--------+------+----------------+----------------+---------+-------+------+-------------+1 row in set (0.00 sec)

现在,如果您在 C 上尝试过滤,那么您会看到一个不同的故事。 EXPLAIN 显示 MySQL 实际上正在使用唯一索引,但正在使用 Using where 标识的过滤谓词进行全索引扫描 (type = index)在 Extra 列中。

mysql> explain select * from tablex where c = 3;+----+-------------+--------+-------+---------------+----------------+---------+------+------+--------------------------+| id | select_type | table  | type  | possible_keys | key            | key_len | ref  | rows | Extra                    |+----+-------------+--------+-------+---------------+----------------+---------+------+------+--------------------------+|  1 | SIMPLE      | tablex | index | NULL          | idx_abc_unique | 12      | NULL |    1 | Using where; Using index |+----+-------------+--------+-------+---------------+----------------+---------+------+------+--------------------------+1 row in set (0.00 sec)

这是 SQLFiddle 演示

如果我们在 C 上创建显式索引

mysql> create index idx_c on tablex (c);Query OK, 0 rows affected (0.03 sec)Records: 0  Duplicates: 0  Warnings: 0

并查看EXPLAIN 我们将再次看到使用索引

mysql> explain select * from tablex where c = 3;+----+-------------+--------+------+---------------+-------+---------+-------+------+-------------+| id | select_type | table  | type | possible_keys | key   | key_len | ref   | rows | Extra       |+----+-------------+--------+------+---------------+-------+---------+-------+------+-------------+|  1 | SIMPLE      | tablex | ref  | idx_c         | idx_c | 4       | const |    1 | Using index |+----+-------------+--------+------+---------------+-------+---------+-------+------+-------------+1 row in set (0.00 sec)

这是 SQLFiddle 演示

关于MySQL 多个唯一键,缺点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20715458/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com