我应该索引具有以下两个选项之一的字段:无符号,唯一(mysql)吗?

时间:2019-06-29 10:16:15

标签: mysql indexing

请参见下面的代码以了解我的问题

CREATE TABLE seller (
            `id`  INT(11)   NOT NULL    AUTO_INCREMENT,
            `status`            INT(11)    UNSIGNED NOT NULL,
            `phone`     VARCHAR(20)     UNIQUE NOT NULL,

            PRIMARY KEY (`id`),
            KEY `phone` (`phone`),
            KEY `status` (`status`)
)

是我添加了这些 键phonephone), 在代码末尾有statusstatus)行吗?

1 个答案:

答案 0 :(得分:0)

UNSIGNEDUNIQUE是不相关的属性。

UNSIGNED表示您只会在该字段中输入非负数。存储在数据库中的大多数就是这种情况-计数器,长度等。INT SIGNED的范围约为+/- 20亿。 INT UNSIGNED可以容纳0到大约40亿。

UNIQUE包含两点:“唯一性约束”和“索引”。

如果您为该列插入具有相同值的行,则INSERT将收到错误,因为您违反了“唯一性约束”。您使用诸如此类来捕获编程错误。如果您的表中每个小部件都有一行,那么如果尝试为同一小部件​​插入第二行,则很容易出错。

INDEX是使数据库运行更快的关键工具。它提供了一种通过其“ id”查找小部件的快速方法。

虽然我在讨论,但我们来讨论NULLNOT NULL。将NULL视为一列的“额外值”。根据您的业务逻辑,这可能意味着“尚未设置”,“未知值”或其他任何事情。另一方面,通常必须提供 列(再次基于业务逻辑),因此您通常希望将列声明为NOT NULL

一个表可以(并且应该是)一个PRIMARY KEY。它唯一地标识每一行。

PRIMARY KEY UNIQUE INDEX(又名KEY)。所有这些的结构都为BTrees(在MySQL中)。

回到您的问题:

  

是不是我在代码末尾添加了这些KEY电话(电话)和KEY状态(状态)行?

语法正确。它们的作用值得商bat。如果您从不说WHERE phone = '...',那么KEY(phone)是没有用的。拥有它没有害处(除了浪费磁盘空间和使INSERTs减慢一小步之外。)