主键
主键:primary key用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表中最多只能有一个主键,主
键所在的列通常是整数类型。
一个可能被忽略的问题:数据库表中必须有主键吗?
答案是否定的。数据库中的表可以不要主键。
主键的作用
- 保证实体的完整性;
- 加快数据库的操作速度
- 在表中添加新记录时,数据库会自动检查新记录的主键值,不允许该值与其他记录的主键值重复。
- 数据库自动按主键值的顺序显示表中的记录。如果没有定义主键,则按输入记录的顺序显示表中的记录。
主键的特点
- 一张表只能有一个主键,如果其他字段定义为主键,那么原来设定为主键的字段就会取消。
- 主键的值不能重复,也不能为空。
下面来回答是否必须建立主键的问题,这需要从以下两方面考虑:
1.是否满足业务要求
2.数据查询效率,主键可以提高查询效率,当然合理的索引替代也可以,主要看表的功能,如果是用来存储大量数据,并需要经常查询这个表的,建立主键可以加快查询效率从而降低服务器的负担,如无此需求,则不需要,建立反而会占用服务器的资源。
索引
什么是索引?
索引是一种特殊的文件,文件中包含着对数据表里所有记录的引用指针。同时索引是一种数据结构。数据库索引是数据库管理系统中一个排序的数据结构,用来协助快速的查询、更新数据表中的数据。索引的实现通常是B+树。
更通俗的说,索引就相当于目录,为了更方便的找到书中的内容,我们通常先在书前面的目录中查找,通过对内容建立索引形成目录。索引是一个文件,需要占用额外的物理空间。
从定义可以总结出索引的优缺点:
索引的优点:
- 大大加快数据的检索,这也是创建索引最主要的原因和初衷。
- 通过使用索引,提高整体的系统性能。
索引的缺点:
- 时间方面:创建索引和维护索引要耗费时间。因为当对表中的数据进行增加、删除、修改的时候,索引也要动态的维护,从而就会降低增删改的执行效率。
- 空间方面:索引需要占用物理空间。
索引的类型
主键索引:数据列不允许重复,不允许为NULL,一个表只能有一个主键。
唯一索引:数据列不允许重复,允许为NULL值,一个表允许多个列创建唯一索引
- 通过alter table 表名 add unique(列名);创建唯一索引
- 通过alter table 表名 add unique(列名1,列名2);创建唯一组合索引
普通索引:基本的索引类型,没有唯一性的限制,允许为NULL值。
- 通过alter table 表名 add index 索引名(列名);创建普通索引
- 通过alter table 表名 add index 索引名(列名1,列名2,列名3);创建组合索引
全文索引:当对文章字段或有大量文字的字段进行检索时,会使用到全文索引。
- 通过alter table 表名 add fulltext(列名);创建全文索引
索引的数据结构
索引的数据结构和具体存储引擎的实现有关,在MySQL中使用较多的索引有Hash索引、B+树索引等。我们经常使用的InnoDB存储引擎的默认索引实现为B+树索引。Hash索引,其底层的数据结构就是哈希表,因此在绝大多数需要为单条记录查询的时候,可以选择哈希索引,查询速度最快,其余大部分场景选择B+树索引。
B+树索引
- 所有关键字都出现在叶子节点的链表中(稠密索引),且链表中的节点都是有序的。
- 不可能在非叶子节点命中。
- 非叶子节点相当于是叶子节点的索引(稀疏索引),叶子节点相当于存储数据的数据层。
- 更适合文件索引系统
哈希索引
哈希索引类似于数据结构中简单实现的散列表,当我们在mysql中用哈希索引时,主要就是通过hash算法(常见的有直接定制法、平方取中法、折叠法、除数取余法、随机数法),将数据库字段数据转换成定长的hash值,与这条数据的行指针一起存入hash表的对应位置,如果发生哈希冲突,即两个不同关键字的hash值相同,则在对应的hash键下以链表的形式存储。
索引的基本原理
索引用来快速地寻找那些具有特定值的记录,如果没有索引,一般来说执行查询时遍历整张表。
索引的原理就是把无序的数据变成有序的查询。
- 把创建了索引的列的内容进行排序
- 对排序结果生成倒排表(倒排索引:由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因而称为倒排索引)
- 在倒排表内容上拼上数据地址链
- 在查询的时候,先拿到倒排表的内容,再取出数据地址链,从而拿到具体数据。
主键与索引的区别
- 主键是为了标识数据库记录唯一性,不允许记录重复,且键值不能为空,主键也是一个特殊索引.
- 数据表中只允许有一个主键,但是可以有多个索引.
- 使用主键会数据库会自动创建主索引,也可以在非主键上创建索引,方便查询效率.
- 索引可以提高查询速度,它就相当于字典的目录,可以通过它很快查询到想要的结果,而不需要进行全表扫描.
- 除了主键索引外索引的值可以为空.
- 主键也可以由多个字段组成,组成复合主键,同时主键肯定也是唯一索引.
- 唯一索引则表示该索引值唯一,可以由一个或几个字段组成,一个表可以有多个唯一索引.