索引是什么?有什么作用以及缺点
定义:索引是存储引擎用于快速查找数据的一种数据结构。
MySQL数据库基本的索引类型:普通索引、唯一索引、主键索引和全文索引。
普通索引:允许被索引的数据列包含重复的列
唯一索引:不允许被索引的数据包含重复的列
主键索引:在一张表中只能定义一个主键索引,主键索引用于唯一标识一条记录(主键索引必然属于唯一索引),使用关键字PRIMARY KEY创建
索引的目的是什么
- 快速访问数据表中的特定信息,提高检索速度
- 创建唯一性索引,保证数据库表中每一行数据的唯一性
- 加速表和表之间的连接
- 使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序时间
索引对数据库系统的负面影响
- 创建和维护索引需要耗费时间。这个时间随着数据量增加而增加
- 索引需要占用额外的物理空间。
- 对表进行增、删、改的时候需要动态维护,降低了数据的维护速度。
建立索引的原则
- 频繁使用的字段
- 选择性高的字段
- 需要排序的字段
主键、外键和唯一索引的区别
主键:唯一标识一条记录,不能有重复,不允许为空。一个表只能有一个主键
外键:表的外键是另一个表的主键,外键可以有重复的,可以为空值(但是无意义,不推荐使用)。一个表可以有多个外键
唯一索引:用来提高查询排序的速度,没有重复值,但允许有一个空值。一个表可以有多个唯一索引。
MySQL底层实现,MySQL有什么引擎
MySQL底层采用B+树实现,B+树可以看作2-3树的一种扩展,B+树是每个节点允许存在多个元素,并且每个节点有多个孩子的多叉查找树,B+树的非叶子节点存储的是导航信息,不包含实际的值,而叶子节点存储了实际的值,所有的叶子节点和相邻的节点采用链表连接,便于区间查找和遍历。
关于叶子节点存储的值,在InnoDB中非主键索引中,存储的是主键的信息,而聚簇索引(主键索引)中存储的是实际数据。而在MyISAM中叶子节点存储的是指向实际数据存储位置的指针。MySQL在5.5版本采用的是MyISAM作为默认的数据库引擎,之后就被更优秀的InnoDB引擎替代。