两种数据库引擎和聚簇(非聚簇)索引

一:两种数据库引擎区别及如何选择?

InnoDB和MyISAM的区别?

1:InnoDB支持事务,而MyISAM不支持事务。这是MYSQL将默认引擎从MYISAM变为INNODB的重要原因之一。

2:INNODB支持外键,而MYISAM不支持。对一个包含外键的INNODB表转为MYISAM会失败。

3:INNODB是聚集索引,MYISAM是非聚集索引。聚簇索引的文件放在主键索引的叶子节点上,因此,INNODB必须要有主键,通过主键索引效率很高,,但是辅助索引需要两次查询,然后在通过主键查询到数据,因此,主键不应该过大,因为主键过大,其他索引也会很大,而MYISAM是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针,主键索引和辅助索引是独立的。

4:INNODB不保存表的具体行数,执行select*from table时会全表扫描。而MYISAM用一个变量保存整个表的行数,执行上述语句时只需要读出该变量即可,速度很快。

5:INNODB最小的锁粒度时行锁,MYISAM最小的是表锁,一个更新语句会锁住整张表,导致其他查询和更新都会被阻塞,因此并发受限,这也是替换的重要原因之一。

如何选择?

1:是否支持事务,如果需要选择INNODB,否则可以考虑MYISAM。

2:如果表中绝大多数都是读查询,可以考虑MYISAM,如果读写很频繁,使用INNODB。

3:系统崩溃后,MYISAM恢复起来更困难,能否接受,不能选择INNODB,

4:MYSQL5.5版本以后INNODB已经成为MYSQL默认引擎,说明优势还是有目共睹的,不知如何选择就是用INNODB。

删除数据库需要注意什么?

使用drop database命令需要非常谨慎。再执行改命令时,MYSQL不会有任何提示确认信息,用drop database声明删除数据库后,数据库中存储的数据及数据表也会一并被删除,不能恢复。

二:删除数据库时需要注意什么?

使用DROP DATABASE命令时要非常谨慎,在执行该命令时,MySQL 不会给出任何提醒确认信息。用DROP DATABASE声明删除数据库后,数据库中存储的所有数据表和数据也将一同被删除,而且不能恢复。

三:常见的表约束

主键:主码。代表这条记录的唯一性,主键是不能重复的,而且不能为空。设置数据加快数据库的查询速度

主键可以由一列组成或多列组成,多列最多两列。

能选一列绝对不选两列

主键的值很少更改,计划不改的

primary key :

auto_increment:自增的

【oracle数据库主键不能自诊,sqlserver用的是标识列】

唯一:unique

非空

默认值

外键

检查约束check 【mysql 5.x不支持】 mysql8.0支持了check约束。

四:聚簇索引(数据)和非聚簇索引(地址)

在MySQL中不管是InnoDB还是MyISAM都是使用B+树来组织表中的数据的。但是在具体实现方法上略有不同。

InnoDB的主键索引是聚簇索引,在InnoDB的实现中,把主键作为关键字组织到B+树的各个节点上,而叶子节点上存储的是主键列的值和对应的整行数据。注意这里说的是将表中实际的一整行数据直接存到叶子节点上。

MyISAM是非聚簇索引,在MyISAM的实现中,叶子节点中存储的是一行数据在磁盘上的地址(可以理解为行号)。

所以聚簇索引和非聚簇索引本质的区别就是B+树的叶子节点上存储的是行数据还是行数据的地址(行号)。

InnoDB中的二级索引的叶子结点中存的是索引列的值和主键值,所以在使用二级索引查询的时候,首先通过二级索引查找到主键值,然后再根据主键值到主键索引的叶子结点中查到对应的整行数据。(回表查询:如果查询列全部命中索引则不需要回表

而MyISAM的二级索引的叶子节点中保存的是指向物理数据的指针,因此它的主建索引和二级索引的结构并没有任何区别,只是说主键索引的索引值是唯一且非空的。

你可能感兴趣的:(数据库,数据库)