1. 三大范式 1.1 去范式
从业务的角度来看,我们应该设计一个满足范式标准要求的表结构。
2、mysql的几个引擎有什么区别?
特性 事物 安全性 支持 不支持 不支持 外部支持 支持 不支持 不支持 存储限制 64TB 是 可用空间使用率 高 低 低 内存使用率 高 低 高 插入数据的速度 低 高 高
2.1、比较 3.为什么使用自增主键 4.什么是索引?
❝
百度百科解释:索引是一种对数据库表中一个或多个列的值进行排序的结构。 索引可以用来快速访问数据表中的特定信息。
❞
索引只是一本书的目录,它可以大大提高我们在数据库中的查询效率。
4.1 指数的优点和缺点是什么?
优势:
缺点:
4.2 索引的数据结构是怎样的?
索引的数据结构主要包括B+树和哈希表,对应的索引分别是B+树索引和哈希索引。 默认索引类型是B+树索引。
4.3 索引有哪些类型?
MySQL的主要索引类型主要有HASH、BTREE、RTREE。
4.4 索引有哪些类型? 4.5 什么是聚集索引,什么是非聚集索引? 4.6 指数的设计原则是什么? 4.7 索引失败的场景有哪些? 4.8 创建索引的语法:
首先创建一个表:table t1(id int key,(20),(20));
创建单个索引的语法:INDEX 索引名 on 表名(字段名)
索引名称一般为:表名_字段名
为id创建索引:INDEX t1_id on t1(id);
创建联合索引的语法:INDEX索引名 on 表名(字段名1,字段名2)
在总和上创建联合索引:index ON t1(,)
其中index也可以用key代替,分别代表唯一索引和主键索引
删除索引:DROP INDEX ON t1
5. 数据库事务 5.1 什么是事务? 其特点是什么?
事务是指程序中的一系列操作必须全部成功完成,如果其中一个失败,则全部失败。
特征:
5.2 事务隔离级别? 5.3 隔离实现原理:
隔离的实现原理比较特殊,是通过数据库锁的机制来实现的。
有四个隔离级别:
“MySQL 的默认隔离级别是可重复读。” 数据库的隔离级别可以解决数据库的脏读、不可重复读、幻读等问题。
5.4 隔离级别是如何实现的?
事务的隔离机制主要依赖于锁机制和MVCC(多版本并发控制)。 通过MVCC可以实现提交读和可重复读,通过锁机制可以实现序列化。
6.什么是MVCC,它有什么作用?
MVCC:多版本并发控制,主要用于提高数据库的并发性能。
MVCC的作用是解决无锁的数据库读写冲突问题,解决脏读、幻读、不可重复读等问题,但无法解决丢失修改的问题。
7. 数据库锁 7.1 什么是数据库锁?
当数据库有并发事务时,保证数据访问顺序的机制称为锁机制。
数据库锁和隔离级别的关系?
7.2 数据库锁有哪些类型?
默认使用表级锁,默认使用行级锁。
从锁的类别来看,可以分为共享锁和排他锁
7.3 什么是数据库中的乐观锁和悲观锁,如何实现?
乐观锁:系统假设大多数时候数据更新不会引起冲突,因此数据库只有在提交更新操作时才检测数据冲突。 如果存在冲突,则数据更新失败。
乐观锁实现:一般通过版本号和CAS算法来实现。
悲观锁:假设会发生并发冲突,并阻止所有可能违反数据完整性的操作。 通俗地说,就是每次你去获取数据的时候,你都认为别人会修改它,所以你每次获取数据的时候都会加锁。
如何实现悲观锁:通过数据库的锁机制,在查询语句中添加for。
7.4 什么是死锁? 如何避免呢?
死锁是指两个或多个进程在执行过程中争夺资源或相互通信而导致的阻塞现象。 在MySQL中,所有需要的锁都会一次性获得,要么全部满足,要么等待,因此不会发生死锁。 在存储引擎中,除了单个SQL组成的事务外,锁都是逐渐获取的,因此存在死锁问题。
如何避免 MySQL 中的死锁或锁冲突:
如果不同的程序同时访问多个表,请尝试以相同的顺序访问这些表。 程序批量处理数据时,如果数据已经排序,尽量保证每个线程按照固定的顺序处理记录。 在一个事务中,如果需要更新一条记录,应该直接申请足够级别的排它锁,而不是先申请共享锁,更新的时候再申请排它锁,因为其他事务可能已经获得了相同的锁记录当前用户申请排他锁共享锁时,导致锁冲突或死锁。 使用尽可能低的隔离级别。 尽量使用索引来访问数据,使锁定更加准确,从而减少锁冲突的机会。 合理选择事务的大小,小事务发生锁冲突的概率较低。 尽量使用相等条件访问数据,避免Next-Key锁对并发插入的影响。 不要申请超出实际需要的锁级别,查询时尽量不要显示锁定。 对于某些特定的事务,可以使用表锁来提高处理速度或降低死锁的概率。 8、B树和B+树有什么区别?
9、数据库为什么使用B+树而不是B树? 9.1 什么情况下适合使用B树?
因为B树的内部节点也可以存储值,所以一些经常访问的值可以放在离根节点较近的地方,这样可以提高查询效率。
10、MySQL执行SQL语句的流程是怎样的?
10.1 SQL查询语句在MySQL中是如何执行的? 11.,,,? 它是归档日志,属于层日志。 它是一个二进制格式的文件,用于“记录用户对数据库更新的SQL语句信息”。
主要功能:主从复制、数据恢复。
是存储引擎的日志,用于保证数据的原子性。 “保存了事务发生前数据的一个版本,也就是说记录的数据是修改前的数据,可以用于回滚。” 同时,它可以提供版本并发控制(MVCC)下的多个Read。
主要功能:事务回滚和多版本控制(MVCC)的实现。
它是一个中继日志,“在主从同步期间使用”。 是一个中间临时日志文件,用于存储从从节点同步过来的日志内容。 它是“存储引擎特有的一种日志”。 用于记录交易操作的变化。 它记录了数据修改后的值,无论事务是否提交都会被记录。
可以做“数据恢复并提供崩溃安全功能”。 当有涉及增删改查的操作时,会先记录到缓存中,然后修改缓存页面中的数据。 “直到mysql空闲时,缓存中的数据才会真正写入磁盘。”
12.谈论两阶段提交。
两阶段提交分为 和 阶段:
准备阶段:首先将事务SQL写入重做日志,然后做事务准备标记,然后将日志中的数据刷新到重做日志。 然后在重做日志中为事务提交做一个标记,并将写入成功的标记写入重做日志文件中。
两阶段提交如何保证数据库一致性的场景分析。
在准备阶段,重做日志被刷新到磁盘,但是在写入磁盘之前mysql实例崩溃了。 这个时候会发生什么? 在提交阶段,写盘成功,但是此时mysql实例崩溃了。 这时候就已经保证写入成功了。 当我们重启实例进行恢复时,我们只需要重做一次重做日志。 13. 分库分表相关 13.1 分库分表方案: 13.2 分库分表常用中间件: 13.3 分库分表可能遇到的问题 13.4 如何垂直分库,水平分表的原理是什么?垂直分割
优势:
拆分后业务清晰,拆分规则清晰。 易于在系统之间集成或扩展。 数据维护简单。
缺点:
有些业务表无法Join,只能通过接口解决,增加了系统复杂度。 由于各业务的限制不同,存在单一数据库性能瓶颈,导致数据扩展和性能提升困难。 事务处理复杂,水平分割
如果垂直拆分后遇到单机瓶颈,可以使用水平拆分。 与垂直拆分相比,不同之处在于:垂直拆分是将不同的表拆分到不同的数据库中,而水平拆分是将同一张表拆分到不同的数据库中。
与垂直拆分相比,水平拆分不是将表中的数据进行分类,而是按照某个字段的一定规则分散到多个库中,每个表包含一部分数据。 简单来说,我们可以将数据的水平切分理解为按照数据行进行切分,即表中的某些行切入一个数据库,其他一些行切入其他数据库。 ,主要有分表和分库两种模式。
优势:
不存在单库大数据、高并发性能瓶颈。 对应用程序透明,需要应用程序端修改较少。 按照合理的拆分规则进行拆分,而join操作则基本避免了跨数据库。 提高了系统稳定性和负载能力。
缺点:
分裂规则很难抽象。 分片事务一致性很难解决。 多次扩展数据很困难并且需要大量维护。 跨数据库连接性能较差。 14、Mysql如何在主从之间同步数据?
1. 主库将更新的事件类型写入“主库的文件”。 2、“创建日志转储线程,通知slave”数据需要更新。 3.“Slave”向节点发送请求“将文件内容保存到本地”。 4、“Slave打开sql线程”读取内容,“在本地重新执行内容”完成主从数据同步。
14.1 同步策略
1、“全同步复制”:主库强行同步日志到从库,等待所有从库执行完才返回给客户端,导致性能较差。 2、“半同步复制”:当主库收到至少一个从库的确认时,认为操作成功。 从库成功写入日志并返回ack确认。
14.2 如何解决主从延迟? 主从复制分为五个步骤:
主库的更新事件(,,)写入。 启动从库到主库的连接。 此时主库创建一个dump并将内容发送到从库。 从库启动后,创建I/O线程,读取主库传递过来的内容,写入relay log。 还会创建一个SQL线程,用于从relay log中读取内容,从该位置执行读更新事件,并将更新内容写入slave的db中。 主从同步延迟的原因:
一台服务器打开N个连接供客户端连接,因此会有大量的并发更新操作,但只有一个线程从服务器读取。 当某个SQL在服务器上执行时间较长或者因为某个SQL需要锁表,导致主服务器上会出现大量SQL积压,无法同步到从服务器上。 这就导致了主从不一致,即主从延迟。
主从同步延迟的解决方案
1.MySQL 5.6版本及更高版本提供了“并行复制”方法,通过将SQL线程转换为多个工作线程来进行重放。 2.“改进机器配置”增加从服务器的压力,分散读取压力,从而减轻服务器负载。 3、业务前期选择合适的分库、分表策略,“避免单表数据库过大造成复制压力过大” 4、“避免长事务”。 5.“避免让数据库执行各种大规模操作。” 6、对于一些对延迟非常敏感的业务,“直接使用主库读取”。
15.如何优化SQL? 告诉我你的 Sql 调优想法。
16.你了解慢日志查询吗? 也算慢查询吗? 如何优化慢查询?
慢查询一般用于记录执行时间超过一定阈值的SQL语句。
相关参数:
:是否开启慢日志查询,1表示开启,0表示关闭。 :MySQL数据库慢查询日志存储路径。 :慢查询阈值。 当SQL语句查询时间大于阈值时,就会记录在日志中。 :不使用索引的查询会记录在慢查询日志中。 :日志存储方式。 “FILE”表示将日志存储在文件中。 “TABLE”表示将日志存储在数据库中。 如何优化慢查询?
分析语句的执行计划,检查SQL语句的索引是否命中优化数据库的结构,将字段较多的表分解为多个表,或者考虑创建中间表。 优化LIMIT分页。
17. 为什么要将该字段设置为非空?
首先,NULL 与空值不同。 Null值不占用空间,但NULL会占用空间。 因此,字段设置为NOT NULL后,仍然可以插入空值。
设置该字段不为空的主要原因如下:
NULL值会影响一些函数的统计,比如count。 如果遇到NULL值,则该记录不会被纳入统计。
B树不存储NULL,所以索引不能使用NULL,这会导致第一点提到的统计不足的问题。
当存在NULL值时NOT IN子查询返回的结果全部为空值。
18. char 和 char 有什么区别? 18.1 为什么建议不要超过255? 18.2 (10) 和 int(10) 是什么意思? 19. drop 和 之间有什么区别?
速度快的逐行删除很快,而慢快类型则回滚,无法回滚。 可以回滚,也不能回滚。 删除内容会删除整个表,数据行和索引都会被删除。 ,删除表中所有数据
总结:删除整个表,使用drop删除表中使用的部分数据,保留表结构删除表中使用的全部数据。
20 如何优化慢查询?
慢查询一般用于记录执行时间超过一定阈值的SQL语句。
20.1 如何查找查询速度慢的原因? 如需记录慢查询日志并分析查询日志,可以使用pt-query-工具进行分析。
相关参数:
展示
set profiling=1; //开启,服务器上所有执行语句会记录执行时间,存到临时表中
show profiles
show profile for query 临时表ID
展示
show 返回一些计数器,show 查看所有服务器级别的所有计数。 有时,根据这些计数,您可以推断哪些操作成本更高或花费大量时间。
展示
观察是否有大量线程处于异常状态或特征:
使用分析语句
分析slow语句是否命中索引:
(1)ID列:是语句的序号。 MySQL将查询分为简单查询和复杂查询。
(2) :表示对应的行是简单查询还是复杂查询。
(3)表列:表示一行正在访问哪个表。
(4)类型栏:最重要的栏目之一。 表示关联类型或访问类型,这是MySQL确定如何在表中查找行的方式。 从最好到最差: > const > > ref > > > > > > range > index > ALL
(5) :显示查询可能使用哪些索引来查找。
(6)键列:该列显示mysql实际使用哪个索引来优化对表的访问。
(7):显示mysql在索引中使用的字节数。 通过这个值,你可以计算出索引中哪些列被使用。
(8) ref列:该列显示在键列中记录的索引中查表中使用的列或常量值。 常见的有:const(常量)、func、NULL、字段名。
(9)rows列:该列是mysql估计要读取和检测到的行数。 请注意,这不是结果集中的行数。
(10) 附加栏:显示附加信息。 比如有Using index、Using where、Using等等。
20.2 如何优化慢查询?
关注我免费领取java面试题资料和讲解!
好了,今天的主题就讲到这里吧,不管如何,能帮到你我就很开心了,如果您觉得这篇文章写得不错,欢迎点赞和分享给身边的朋友。