当前位置: 首页 > 知识库问答 >
问题:

2列和索引的MySQL唯一

岳永思
2023-03-14

我创建下表:

CREATE TABLE ta
(
    id                  BIGINT      NOT NULL auto_increment,
    company_id          BIGINT      NOT NULL,
    language            VARCHAR(10) NOT NULL,
    created_at          DATETIME,
    modified_at         DATETIME,
    version             BIGINT,
    PRIMARY KEY (id),
    UNIQUE KEY unique_ta (company_id, language)
) engine = InnoDB;


CREATE INDEX ta_company_id on `ta` (company_id);

我的问题是我是否需要这句话:

CREATE INDEX ta_company_id on `ta` (company_id);

unique是否自动对company_id,language创建索引?

共有1个答案

鲁博赡
2023-03-14

您可能不需要company_id上的额外索引。

UNIQUE键按此顺序创建一对列(company_idlanguage)的索引。因此,任何搜索company_id特定值的查询都可以使用该索引,即使它只引用唯一键索引的第一列。

您可以在Explain中看到这一点:

mysql> EXPLAIN SELECT * FROM ta WHERE company_id = 1234;
+----+-------------+-------+------------+------+---------------+-----------+---------+-------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key       | key_len | ref   | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+-----------+---------+-------+------+----------+-------+
|  1 | SIMPLE      | ta    | NULL       | ref  | unique_ta     | unique_ta | 8       | const |    1 |   100.00 | NULL  |
+----+-------------+-------+------------+------+---------------+-----------+---------+-------+------+----------+-------+

您可以看到key_len:8表示它使用了8个字节的索引,而company_id的第一个BIGINT是8个字节。

而搜索这两个列将使用索引的全部50字节大小(BIGINT为8字节+VARCHAR为10个字符,每个字符使用utf8mb4为4字节,加上VARCHAR长度的几个字节):

mysql> EXPLAIN SELECT * FROM ta WHERE company_id = 1234 AND language = 'EN';
+----+-------------+-------+------------+-------+---------------+-----------+---------+-------------+------+----------+-------+
| id | select_type | table | partitions | type  | possible_keys | key       | key_len | ref         | rows | filtered | Extra |
+----+-------------+-------+------------+-------+---------------+-----------+---------+-------------+------+----------+-------+
|  1 | SIMPLE      | ta    | NULL       | const | unique_ta     | unique_ta | 50      | const,const |    1 |   100.00 | NULL  |
+----+-------------+-------+------------+-------+---------------+-----------+---------+-------------+------+----------+-------+

我在顶部说“可能”是因为有一个例外情况,对于特定形式的查询:

SELECT * FROM ta WHERE company_id = 1234 ORDER BY id;

这种类型的查询需要id作为索引的第二列,因此可以确保按主键顺序读取行。所有索引都隐式地追加了主键列,即使您没有声明它。因此,您的唯一键索引将真正存储列(company_id,language,id),而单列索引将真正存储列(company_id,id)。后一个索引将优化上面显示的查询,按主键进行高效排序。

 类似资料:
  • 本文向大家介绍MySQL普通索引和唯一索引的深入讲解,包括了MySQL普通索引和唯一索引的深入讲解的使用技巧和注意事项,需要的朋友参考一下 场景 1、维护一个市民系统,有一个字段为身份证号 2、业务代码能保证不会写入两个重复的身份证号(如果业务无法保证,可以依赖数据库的唯一索引来进行约束) 3、常用SQL查询语句:SELECT name FROM CUser WHERE id_card = 'XX

  • 问题内容: 就性能而言,MySQL唯一索引和非唯一索引有什么区别? 假设我要在2列的组合上创建索引,并且该组合是唯一的,但是我创建了一个非唯一的索引。这会对MySQL使用的性能或内存产生重大影响吗? 同样的问题, 主 键和 唯一 索引之间有区别吗? 问题答案: UNIQUE和PRIMARY KEY是 约束 ,而不是索引。尽管大多数数据库通过使用索引来实现这些约束。除了索引之外,约束的额外开销也微不

  • CreateIndexes 根据struct中的tag来创建索引 CreateUniques 根据struct中的tag来创建唯一索引

  • 本文向大家介绍MySQL索引使用说明(单列索引和多列索引),包括了MySQL索引使用说明(单列索引和多列索引)的使用技巧和注意事项,需要的朋友参考一下 1. 单列索引 在性能优化过程中,选择在哪些列上创建索引是最重要的步骤之一。可以考虑使用索引的主要有两种类型的列:在Where子句中出现的列,在join子句中出现的列。请看下面这个查询: 这个查询与前面的查询略有不同,但仍属于简单查询。由于age是

  • 问题内容: 我有一个清单说。我想为每个唯一值分配一个特定的“索引”来获取。 这是我的代码: 事实证明这很慢。 具有1M个元素和100K个唯一元素。我也尝试过用lambda和sort进行地图操作,这没有帮助。这样做的理想方法是什么? 问题答案: 由于执行线性搜索,然后对中的每个元素执行线性搜索,因此导致代码变慢。因此,对于每1M个项目,您要进行(最多)100K个比较。 将一个值转换为另一个值的最快方

  • 问题内容: 不知道在PostgreSQL 9.3+中是否可行,但是我想在非唯一列上创建唯一索引。对于像这样的表: 我想仅能[快速]查询不同的日子。我知道我可以用来帮助执行不同的搜索,但是如果不同值的数量大大少于索引覆盖的行数,这似乎会增加额外的开销。就我而言,大约30天中有1天与众不同。 我是创建关系表以仅跟踪唯一条目的唯一选择吗?思维: 并在每次插入数据时使用触发器来更新它。 问题答案: 索引只