索引中的漏洞会以某种方式影响数据库吗?

时间:2019-04-04 11:20:15

标签: mysql database optimization

在创建新索引时,人们似乎在尝试避免在索引中出现漏洞,并通常使用自动增量。但为什么?背后的原因是什么?保养?安全?还是根本不漂亮?
因为就我而言,我想创建一个图书目录数据库,并且出于一致性的原因,我想确保“图书”表的索引与对应于第一版的出版号的ISBN号的片段匹配这本书的出版商。
但是,某些重新发行有其自己的ISBN,但本身不会被视为图书实体,因此会产生漏洞(重新发行的数据将与第一版数据合并)。

我将MySQL 5.7.23与phpMyAdmin结合使用。

在这里,我瞄准的是“ Book”和“ ISBN”表的交汇处的视图

num_book | ISBN
--------------------------------
1        | XXX-X-XXXXXX-1-X
         | XXX-X-XXXXXX-5-X
         | XXX-X-XXXXXX-9-X
         | XXX-X-XXXXXX-14-X
2        | XXX-X-XXXXXX-2-X
3        | XXX-X-XXXXXX-3-X
         | XXX-X-XXXXXX-6-X
         | XXX-X-XXXXXX-8-X
4        | XXX-X-XXXXXX-4-X
7        | XXX-X-XXXXXX-7-X
         | XXX-X-XXXXXX-13-X
10       | XXX-X-XXXXXX-10-X
11       | XXX-X-XXXXXX-11-X
12       | XXX-X-XXXXXX-12-X
15       | XXX-X-XXXXXX-15-X

我打算将“ num_block ”与这些有意的漏洞一起用作表的主键,然后与ISBN表联接。
索引号将保持增加,但不一定是连续的(即1、2、3、4、7、10、11、12、15)
我应该为此担心吗?

谢谢您的关注。

编辑: scaisEdge 所说,忘记了不能从0开始的索引,已更正。 有关说明和草图的更多说明和歧义(添加图例):它不是同一张表,而是两个表(书和ISBN)联接的视图,因此“ num_book”值是唯一的,但可以绑定到多个“ ISBN” “。

1 个答案:

答案 0 :(得分:1)

我认为您同时是在指几个不同的概念。

主键和索引之间有区别。

主键是一个逻辑概念-它提供对表中一行的唯一不变的引用。当其他实体引用主键时,它不能为空。

索引是一个物理概念-它是数据库在该列中查找条目的一种方式。您可以指定索引不为空且唯一。

物理上实现主键逻辑概念的通常方法是通过唯一的非空索引。

下一个问题是如何分配主键;有两个候选者:自然键反映问题域中的实体,代理键由数据库自动分配。

在实践中,自然键很少(保证唯一,不为null,不变)-我对ISBN的分配方式了解不足,无法确定它们是否合适。但是我已经看到了社会安全号码(他们被错误地输入到系统中),电话号码(人们更改了他们的电话号码)等问题。

代理键由数据库引擎分配。它们通常是自动递增的整数,但是它们也可以是UUID-只要保证它们是唯一的且不为null。自动递增整数很受欢迎的原因有两个。

许多主键是使用聚簇索引实现的。聚集索引会影响数据在磁盘上的存储顺序,因此,如果您有聚集索引,则在写入ID为1000的记录后插入ID为1的记录意味着要对磁盘上的数据重新排序。

间隙并不是真正的问题-只要按顺序插入即可。

但是...这种逻辑来自1980年代。那时,聚集索引明显比非聚集索引快。在现代硬件上,多数情况下并非如此。

因此,只要您对ISBN的分配方式充满信心,就没有明显的理由使您的分配主键的方案成为问题。