关于数据库的主从、索引以及存储引擎的核心原理

简介: 数据库的主从、索引以及存储引擎讲解

数据库三范式

一:确保每列的原子性

二:非主键列不存在对主键的部分依赖 (要求每个表只描述一件事情)

三:满足第二范式,并且表中的列不存在对非主键列的传递依赖

数据库主从复制原理

(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 中索引列使用了函数或有运算

目录
相关文章
|
7天前
|
存储 关系型数据库 MySQL
Mysql(4)—数据库索引
数据库索引是用于提高数据检索效率的数据结构,类似于书籍中的索引。它允许用户快速找到数据,而无需扫描整个表。MySQL中的索引可以显著提升查询速度,使数据库操作更加高效。索引的发展经历了从无索引、简单索引到B-树、哈希索引、位图索引、全文索引等多个阶段。
38 3
Mysql(4)—数据库索引
|
14天前
|
缓存 算法 关系型数据库
Mysql(3)—数据库相关概念及工作原理
数据库是一个以某种有组织的方式存储的数据集合。它通常包括一个或多个不同的主题领域或用途的数据表。
38 5
Mysql(3)—数据库相关概念及工作原理
|
15天前
|
SQL 关系型数据库 数据库
SQL数据库:核心原理与应用实践
随着信息技术的飞速发展,数据库管理系统已成为各类组织和企业中不可或缺的核心组件。在众多数据库管理系统中,SQL(结构化查询语言)数据库以其强大的数据管理能力和灵活性,广泛应用于各类业务场景。本文将深入探讨SQL数据库的基本原理、核心特性以及实际应用。一、SQL数据库概述SQL数据库是一种关系型数据库
20 5
|
16天前
|
SQL 关系型数据库 MySQL
sql注入原理与实战(三)数据库操作
sql注入原理与实战(三)数据库操作
sql注入原理与实战(三)数据库操作
|
9天前
|
关系型数据库 MySQL 数据库
深入浅出MySQL索引优化:提升数据库性能的关键
在这个数据驱动的时代,数据库性能的优劣直接关系到应用的响应速度和用户体验。MySQL作为广泛使用的数据库之一,其索引优化是提升查询性能的关键。本文将带你一探MySQL索引的内部机制,分析索引的类型及其适用场景,并通过实际案例演示如何诊断和优化索引,以实现数据库性能的飞跃。
|
13天前
|
存储 SQL 数据库
深入理解数据库索引:提升查询性能的关键
数据库索引是优化查询性能的重要工具。本文将带你深入探索索引的内部结构和工作原理,揭示如何通过合理使用索引来加速数据库查询,同时避免常见的索引陷阱。
|
16天前
|
SQL 存储 Java
sql注入原理与实战(二)数据库原理
sql注入原理与实战(二)数据库原理
|
27天前
|
监控 关系型数据库 MySQL
如何优化MySQL数据库的索引以提升性能?
如何优化MySQL数据库的索引以提升性能?
70 0
|
27天前
|
监控 关系型数据库 MySQL
深入理解MySQL数据库索引优化
深入理解MySQL数据库索引优化
34 0
|
2月前
|
C# UED 定位技术
WPF控件大全:初学者必读,掌握控件使用技巧,让你的应用程序更上一层楼!
【8月更文挑战第31天】在WPF应用程序开发中,控件是实现用户界面交互的关键元素。WPF提供了丰富的控件库,包括基础控件(如`Button`、`TextBox`)、布局控件(如`StackPanel`、`Grid`)、数据绑定控件(如`ListBox`、`DataGrid`)等。本文将介绍这些控件的基本分类及使用技巧,并通过示例代码展示如何在项目中应用。合理选择控件并利用布局控件和数据绑定功能,可以提升用户体验和程序性能。
55 0