数据库三范式
一:确保每列的原子性
二:非主键列不存在对主键的部分依赖 (要求每个表只描述一件事情)
三:满足第二范式,并且表中的列不存在对非主键列的传递依赖
数据库主从复制原理
(1):主库 db 的更新事件(update、insert、delete)被写到 binlog
(2):主库创建一个 binlog dump thread 线程,把 binlog 的内容发送到从库
(3):从库创建一个 I/O 线程,读取主库传过来的 binlog 内容并写入到 relay log.
(4):从库还会创建一个 SQL 线程,从 relay log 里面读取内容写入到 slave 的 db.
复制方式分类
(1):异步复制(默认) 主库写入 binlog 日志后即可成功返回客户端,无须等待 binlog 日志传递给从库的过程,但是一旦主库宕机,就有可能出现丢失数据的情况。
(2)半同步复制:( 5.5 版本之后) (安装半同步复制插件)确保从库接收完成主库传递过来的 binlog 内容已经写入到自己的 relay log(传送 log)后才会通知主库上面的等待线程。如果等待超时,则关闭半同步复制,并自动转换为异步复制模式,直到至少有一台从库通知主库已经接收到 binlog 信息为止
存储引擎
(1):Myiasm 是 mysql 默认的存储引擎,不支持数据库事务,行级锁,外键;插入更新需锁表,效率低,查询速度快,Myisam 使用的是非聚集索引
(2):innodb 支持事务,底层为 B + 树实现,适合处理多重并发更新操作,普通 select 都是快照读,快照读不加锁。InnoDb 使用的是聚集索引
聚集索引
(1):聚集索引就是以主键创建的索引
(2):每个表只能有一个聚簇索引,因为一个表中的记录只能以一种物理顺序存放,实际的数据页只能按照一颗 B+ 树进行排序
(3):表记录的排列顺序和与索引的排列顺序一致
(4):聚集索引存储记录是物理上连续存在
(5):聚簇索引主键的插入速度要比非聚簇索引主键的插入速度慢很多
(6):聚簇索引适合排序,非聚簇索引不适合用在排序的场合,因为聚簇索引叶节点本身就是索引和数据按相同顺序放置在一起,索引序即是数据序,数据序即是索引序,所以很快。非聚簇索引叶节点是保留了一个指向数据的指针,索引本身当然是排序的,但是数据并未排序,数据查询的时候需要消耗额外更多的 I/O,所以较慢
(7):更新聚集索引列的代价很高,因为会强制 innodb 将每个被更新的行移动到新的位置
非聚集索引
(1):除了主键以外的索引
(2):聚集索引的叶节点就是数据节点,而非聚簇索引的叶节点仍然是索引节点,并保留一个链接指向对应数据块
(3):聚簇索引适合排序,非聚簇索引不适合用在排序的场合
(4):聚集索引存储记录是物理上连续存在,非聚集索引是逻辑上的连续。
使用聚集索引为什么查询速度会变快?
使用聚簇索引找到包含第一个值的行后,便可以确保包含后续索引值的行在物理相邻
建立聚集索引有什么需要注意的地方吗?
在聚簇索引中不要包含经常修改的列,因为码值修改后,数据行必须移动到新的位置,索引此时会重排,会造成很大的资源浪费
InnoDB 表对主键生成策略是什么样的?
优先使用用户自定义主键作为主键,如果用户没有定义主键,则选取一个 Unique 键作为主键,如果表中连 Unique 键都没有定义的话,则 InnoDB 会为表默认添加一个名为 row_id 隐藏列作为主键。
非聚集索引最多可以有多少个?
每个表你最多可以建立 249 个非聚簇索引。非聚簇索引需要大量的硬盘空间和内存
BTree 与 Hash 索引有什么区别?
(1):BTree 索引可能需要多次运用折半查找来找到对应的数据块 (2):HASH 索引是通过 HASH 函数,计算出 HASH 值,在表中找出对应的数据 (3):大量不同数据等值精确查询,HASH 索引效率通常比 B+TREE 高 (4):HASH 索引不支持模糊查询、范围查询和联合索引中的最左匹配规则,而这些 Btree 索引都支持
数据库索引优缺点
(1):需要查询,排序,分组和联合操作的字段适合建立索引
(2):索引多,数据更新表越慢,尽量使用字段值不重复比例大的字段作为索引,联合索引比多个独立索引效率高
(3):对数据进行频繁查询进建立索引,如果要频繁更改数据不建议使用索引
(4):当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度。
索引的底层实现是 B + 树,为何不采用红黑树,B 树?
(1):B+Tree 非叶子节点只存储键值信息,降低 B+Tree 的高度,所有叶子节点之间都有一个链指针,数据记录都存放在叶子节点中
(2):红黑树这种结构,h 明显要深的多,效率明显比 B-Tree 差很多
(3):B + 树也存在劣势,由于键会重复出现,因此会占用更多的空间。但是与带来的性能优势相比,空间劣势往往可以接受,因此 B + 树的在数据库中的使用比 B 树更加广泛
索引失效条件
(1):条件是 or,如果还想让 or 条件生效,给 or 每个字段加个索引
(2):like 开头 %
(3):如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不会使用索引
(4):where 中索引列使用了函数或有运算