共计 3903 个字符,预计需要花费 10 分钟才能阅读完成。
一、mysql 数据库的原理
答:mysql 是基于客户端与服务器的数据库管理系统,是由 mysqld 服务过程和一些工具程序组成,mysql 客户端能够连贯到该过程,并向其发送 sql,mysqld 负责解释及执行这些语句
二、mysql 架构
答:次要分三层,别离是连贯层,服务层,存储层
三、如何高效的设计数据库表构造
1. 设计规范和标准化
标准和标准化是数据库设计的根底。在设计数据库表构造时,应该遵循一系列规范和标准,这些规范和标准包含但不限于:
– 表名和字段名应该易于了解和表白含意;
– 表和字段应该应用小写字母和下划线命名;
– 表中应该有一个惟一标识符字段;
– 表中应该有一个主键字段;
– 表间应该应用外键字段进行关联;
– 应该尽可能应用数据库束缚(主键、惟一键、外键、默认值、非空值、查看束缚等)来保证数据的完整性和准确性;
– 不应用特殊字符或关键字作为表名或字段名;
2. 防止适度设计
适度设计是数据库设计中一种常见的问题,它会导致数据库结构复杂,难以保护和了解。因而,数据库设计师必须防止适度设计。
在设计数据库时,应该始终记住以下准则:
– 最小化表的数量;
– 最小化表中字段的数量;
– 最小化字段中的数据类型;
– 最小化索引的数量。
3. 抉择适合的数据类型
抉择适合的数据类型对于进步数据库性能十分重要。当抉择数据类型时,应该思考以下因素:
– 数据类型应该尽可能小。应用较小的数据类型能够节俭存储空间并进步查问的速度。例如,如果须要存储年份,应用 INT 更大只须要 4 个字节。
– 应该应用正确的数据类型。当波及到日期和工夫时,应用日期和工夫类型,而不是字符串类型。当波及到金额时,应用 DECIMAL 而不是 FLOAT 类型,因为 DECIMAL 可能提供更高的精度。
– 应该应用对立的数据类型。同一表中,应该应用雷同的数据类型来存储雷同类型的数据。
4. 应用索引
索引对于进步数据库查问速度十分重要。当应用索引时,应该思考以下因素:
– 应该只在须要时才应用索引。应用索引会减少数据插入和更新的工夫,因而应该仅在查问过程中须要它们时应用。
– 应该仅对查问频繁的列应用索引。
– 应该仅为小型表应用索引。大型表的索引会占用大量存储空间并且升高查问性能。
– 应该应用联结索引来进步性能。
5. 正规化数据表
正规化是缩小数据冗余和保护数据完整性的过程。在设计数据库表构造时,应该遵循正规化的规定。
正规化的指标是将数据划分为多个互相关联的表,每个表仅蕴含其实体的惟一信息。不同的表之间应用主键和外键进行关联。
在进行正规化时,应该遵循以下准则:
– 打消反复的数据;
– 将表拆分成绝对较小的表;
– 最小化对反复数据的更新操作;
– 确保每个表只蕴含惟一数据。
6. 应用存储过程和触发器
存储过程和触发器旨在为数据库提供额定的安全性和性能。存储过程是一组 SQL 语句的,能够在须要时进行查问。触发器是与表相关联的一些逻辑,只有表中的一些操作产生,就会主动启动。
应用存储过程和触发器能够进步数据库的性能和可维护性。
7. 备份和复原
备份和复原是数据库设计中最重要的局部之一。备份和复原能够在数据库呈现故障时帮忙复原数据库。
应用备份和复原时,应该思考以下因素:
– 应该定期备份数据库,以确保在系统故障时可能疾速进行复原;
– 应该进行备份测试,以确保备份是可用的;
– 应该在服务器上多个地位存储备份,以确保不会失落所有备份;
– 应该测试复原过程,以确保在须要时能够正确复原数据库。
四、高性能数据表如何设计
范式是关系数据库实践的根底,也是咱们在设计数据库构造过程中所要遵循的规定和领导办法。数据库的设计范式是数据库设计所须要满足的标准。只有了解数据库的设计范式,能力设计出高效率、优雅的数据库,否则可能会设计出低效的库表构造。
目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯 - 科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,还又称完满范式)。
满足最低要求的叫第一范式,简称 1NF。在第一范式根底上进一步满足一些要求的为第二范式,简称 2NF。其余依此类推。各种范式呈递次标准,越高的范式数据库冗余越小。通常所用到的只是前三个范式,即:第一范式(1NF),第二范式(2NF),第三范式(3NF)。
第一范式
第一范式无反复的列,表中的每一列都是拆分的根本数据项,即列不可能再拆分成其余几列,强调的是列的原子性.。
如果在理论场景中,一个联系人有家庭电话和公司电话,那么以“姓名、性别、电话”为表头的表构造就没有达到 1NF。要合乎 1NF 咱们只需把电话列拆分,让表头变为姓名、性别、家庭电话、公司电话即可。
第二范式
第二范式属性齐全依赖于主键,首先要满足它合乎 1NF,另外还须要蕴含两局部内容:
• 表必须有一个主键;
• 没有蕴含在主键中的列必须齐全依赖于主键,而不能只依赖于主键的一部分。即要求实体的属性齐全依赖于主关键字。所谓齐全依赖是指不能存在仅依赖主关键字一部分的属性。
第三范式
第三范式属性不传递依赖于其余非主属性,首先须要满足 2NF,另外非主键列必须间接依赖于主键,不能存在传递依赖。即不能存在:非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的状况。
五、sql 优化的办法
防止应用 select *、用 union all 代替 union、小表驱动大表、批量操作、多用 limit、in 中值太多、增量查问、高效的分页、用链接查问代替子查问、join 数量不宜过多、join 时须要留神、管制索引的数量、抉择正当的字段类型、晋升 group by 的效率、索引优化。
六、servlet 的生命周期
Servlet 的生命周期分为 5 个阶段:加载、创立、初始化、解决客户申请、卸载。
1. 加载:容器通过类加载器应用 Servlet 类对应的文件来加载 Servlet
2. 创立:通过 调用 Servlet 的构造函数来创立一个 Servlet 实例
3. 初始化:通过调用 Servlet 的 init() 办法来实现初始化工作,这个办法是在 Servlet 曾经被创立,但在向客户端提供服务之前调用。
4. 解决客户申请:Servlet 创立后就能够解决申请,当有新的客户端申请时,Web 容器都会 创立一个新的线程来解决该申请。接着调用 Servlet 的
Service() 办法来响应客户端申请(Service 办法会依据申请的 method 属性来调用 doGet()和 doPost())
5. 卸载:容器在卸载 Servlet 之前须要调用 destroy()办法,让 Servlet 开释其占用的资源。
七、msyql 锁
MySQL 中有多种锁类型,包含乐观锁、乐观锁、全局锁、表级锁、页级锁、行级锁、共享锁、排它锁、动向共享锁、动向排它锁、间隙锁、临建锁和记录锁,上面别离介绍一下各种锁:
- 乐观锁(Optimistic Locking):假如并发操作时不会发生冲突,只在提交事务时检查数据是否被其余事务批改过。罕用于读多写少的场景。
- 乐观锁(Pessimistic Locking):假如并发操作时会发生冲突,因而在操作期间持有锁来防止抵触。罕用于写多读少的场景。
- 全局锁(Global Lock):对整个数据库实例加锁,限度除了超级用户外的所有查问和批改操作。个别用于备份、复原等操作。
- 表级锁(Table Lock):对整个表加锁,其余连贯无奈批改或读取该表的数据,但能够对其余表进行操作。
- 页级锁(Page Lock):对数据页(通常是间断的几个行)加锁,管制并发事务对该页的拜访。实用于数据较大且并发量较高的场景。
- 行级锁(Row Lock):对单个行加锁,只锁定须要批改的数据行,其余行能够被同时批改或读取。并发性高,但锁治理较简单。
- 共享锁(Shared Lock):也称为读锁,多个事务能够同时持有共享锁并读取数据,但不能批改数据。实用于同时读取同一数据的场景。
- 排它锁(Exclusive Lock):也称为写锁,事务持有排它锁时,其余事务无奈同时持有共享锁或排它锁,用于爱护数据的写操作。
- 动向共享锁(Intention Shared Lock):表级锁的辅助锁,示意事务要在某个表或页级锁上获取共享锁。
- 动向排它锁(Intention Exclusive Lock):表级锁的辅助锁,示意事务要在某个表或页级锁上获取排它锁。
- 间隙锁(Gap Lock):锁定一个范畴的键,但不包含这些键的理论值。用于避免其余事务在范畴内插入数据。
- 临建锁(Metadata Lock):锁定数据库对象的元数据,如表构造,用于保证数据定义的一致性。
- 记录锁(Record Lock):行级锁的特定类型,锁定单个行,确保其余事务无奈同时批改或读取该行。
这些锁类型在不同的场景中能够组合应用,依据具体需要抉择适当的锁策略来保证数据的一致性和并发性。同时,须要留神锁的粒度、锁抵触、死锁等问题,正当设计和治理锁能够进步数据库的并发性能。
八、四种常见的线程池:
CachedThreadPool: 可缓存的线程池,该线程池中没有外围线程,非核心线程的数量为 Integer.max_value,就是无限大,当有须要时创立线程来执行工作,没有须要时回收线程,实用于耗时少,任务量大的状况。
SecudleThreadPool: 周期性执行工作的线程池,依照某种特定的打算执行线程中的工作,有外围线程,但也有非核心线程,非核心线程的大小也为无限大。实用于执行周期性的工作。
SingleThreadPool: 只有一条线程来执行工作,实用于有程序的工作的利用场景。
FixedThreadPool: 定长的线程池,有外围线程,外围线程的即为最大的线程数量,没有非核心线程
sbringboot 我的项目中用 @EnableAsync 开启线程池,用 @Async 注解标识须要异步的程序