后台开发知识点总结(四)数据库

位图索引

所谓位图索引,就是用一个二进制向量表示一张表中所有数据的某个属性。如一张User表中所有人的性别,或者是User表中所有人的已婚状况。像这种只有两个(或几个)固定值的属性,即使使用B树索引,还是需要取出一半的数据,因此并不能显著地提升效率。
使用位图索引的好处是,可以通过对两个索引进行and操作来快速地找到同时满足两个属性的样本。如要找出User中所有的未婚男性,只需要把性别和已婚状况两个位图索引做and操作,就能快速地得到结果。
位图索引适用于那种只有几个固定值而且不会频繁更新的列。
MySQL不支持这种索引。

MySQL数据库引擎有几种?

ISAM、MYISAM、HEAP、INNODB、BERKELEYDB。

MYISAM 和 INNODB 有什么区别?分别适用于什么情况?

INNODB 支持事务、外键和行级锁,MYISAM 不支持。不过,INNODB 不支持 FULLTEXT 索引,也不保存表具体的行数。
INNODB 比较适合更新比较频繁,或者是要求事务的场景。而 MYISAM 比较适合查询频繁、不要求事务和频繁使用count 的场景。

INNODB 的行级锁什么时候有效?什么时候无效?

只有在 WHERE 判断中是主键的时候有效,其他情况同样会锁全表。

INNODB 和 MYISAM 的索引是怎么实现的?

INNODB 和 MYISAM 的索引都是基于 B+ 树实现的。两者的区别在于,MYISAM 主键索引和辅助索引记录的都是每条数据的地址。而 INNODB 主键索引记录的就是数据本身,辅助索引记录的是主键。因此 INNODB 使用辅助索引需要对主键进行二次索引。所以, 使用 INNODB 的时候应尽量把主键定义得小一些。

B+树、B-树、B*树有什么区别?

B+树与B-树的区别在于:B-树的关键字分布在整棵树中,且一个关键字只出现一次;而B+树中所有关键字都在叶子节点出现,且可以出现多次。另外,B+树为所有叶子节点增加了链指针,且要求非叶子节点子树指针与关键字个数相同。B*树为所有非根非叶子节点也添加了指向兄弟的指针。

INNODB 和 MYISAM 的缓存有什么异同?

INNODB 和 MYISAM 的缓存都是基于LRU算法实现的。区别在于,MYISAM 的缓存 Key Cache 只缓存索引,而 INNODB 的缓存 buffer pool 不仅缓存索引,还缓存数据。INNODB 通过存储日志把内存数据同步到磁盘(因为存储日志是连续存储,速度快;读写数据是随机读写,速度慢)。如果条件允许,可以开辟尽量大的空间作为 buffer pool,这样系统的性能更接近内存数据库。

数据库的锁有几种?

三种。共享锁(S锁,只进行读操作时使用的锁,数据上存在共享锁时不得被更改,以单独去完成马上释放共享锁)、排他锁(X锁,可以防止资源的并发访问,其他事务既不能更改也不能读取上面有排他锁的资源)、更新锁(U锁,一次只有一个事务可以获得某资源的更新锁。如果事务对资源进行更新,则转换为排他锁。若仅进行读取则转换为共享锁。)。

更新锁和排他锁的区别是什么?

更新锁的存在主要是为了防止事务之间发生死锁。事务在修改数据时,首先会获取该资源的共享锁,然后在更改时转换为排他锁。如果两个事务都获取了共享锁而等待另一个事务释放共享锁,那么就会发生死锁。由于更新锁一次只可以被一个事务获取,因此避免了这种死锁的发生。

MySQL数据库索引有几种?

四种。分别是FULLTEXT索引、HASH索引、BTREE索引、RTREE索引。

什么叫FULLTEXT索引?

FULLTEXT索引主要是为了解决WHERE name LIKE “%word%” 操作而产生的。如果没有FULLTEXT索引,那么就要遍历全表。MySQL中,只有MYISAM支持这种索引。
FULLTXET索引依靠词典(所有的单词,所有的非字母和数字都会被认为是单词的分隔符)和倒排表(一个链表,记录了每个单词对应的所有包含该单词的记录(按照某种顺序)组成的链表)实现。查找同时包含两个单词的记录时,合并其对应的链表即可。

HASH索引和BTREE索引有什么区别?

HSAH索引不能使用范围查询,也不能避免排序操作。另外,HSAH索引不能利用部分索引键查询。

简单介绍一下R树?

R树是B树在高维空间的扩展。简单来说,B树每个节点描述的是一个线段,而R树所描述的是一个矩形或立方体(当然,也可能是更高维)。父节点表示的矩形应当能够包括所有子节点所包括的矩形。
这种数据结构主要用来搜索多维空间,比如一个人附近的餐厅。如果没有R树,就需要对所有餐厅的横纵坐标进行比较。而有了R树之后。只需要找到对应的节点就可以了。