当前位置: 首页 > 后端技术 > Java

MySQL秒杀15道题,你能坚持几题?

时间:2023-04-01 23:21:50 Java

前言面试中经常会问到MySQL。本文总结了面试中的经典问题。1、数据库的三大范式是什么?第一范式:每列不能再次拆分。第二范式:在第一范式的基础上,非主键列完全依赖于主键,但不能是主键的一部分。第三范式:在第二范式的基础上,非主键列只依赖于主键,不依赖于其他非主键。在设计数据库结构时,尽量遵守三种范式。如果您不遵守,则必须有充分的理由。比如性能。事实上,我们经常为了性能而妥协数据库设计。2、mysql有多少个权限表?MySQL服务器通过权限表控制用户对数据库的访问。权限表保存在mysql数据库中,由mysql\_install\_db脚本初始化。这些权限表是user、db、table\_priv、columns\_priv和host。用户权限表:记录允许连接服务器的用户账号信息,其中的权限是全局级别的。db权限表:记录了每个账号对每个数据库的操作权限。table\_priv权限表:记录数据表级别的操作权限。columns\_priv权限表:记录数据列级操作权限。主机权限表:配合db权限表更详细地控制给定主机上的数据库级操作权限。该特权表不受GRANT和REVOKE语句的影响。3.介绍事务的四大特性(ACID)?原子性:事务是最小的执行单元,不能拆分。事务的原子性确保动作要么全部完成,要么完全无效;一致性:事务执行前后,数据保持一致,多个事务读取相同数据的结果相同;隔离性:并发访问数据库时,一个用户的事务不受其他事务的干扰,数据库在并发事务之间是独立的;持久性:事务提交后。它对数据库中数据的改变是持久化的,即使数据库出现故障也不应该对其产生任何影响。4、SQL语句主要有哪些类型?数据定义语言DDL(DataDdefinitionLanguage)CREATE、DROP、ALTER主要针对上述操作,即对逻辑结构的操作,包括表结构、视图和索引。数据查询语言DQL(DataQueryLanguage)SELECT比较容易理解,就是查询操作,用select关键字。各种简单的查询,连接查询等都属于DQL。DataManipulationLanguageDML(DataManipulationLanguage)INSERT、UPDATE、DELETE主要是针对上述操作,即对数据进行操作,对应上述查询操作。DQL和DML共同构造了大部分初级程序员常用的增删改查操作。查询是一种特殊的类型,分为DQL。数据控制函数DCL(DataControlLanguage)GRANT、REVOKE、COMMIT、ROLLBACK主要是针对上述操作,即对数据库安全性和完整性的操作,可以简单理解为权限控制。5、MySQL分库分表的目的是什么?分库分表是为了解决由于数据量过大导致数据库性能下降的问题。将原来独立的数据库拆分成若干个数据库,将大数据表拆分成若干个数据表,使单个数据库和单个数据表的数据量变小,从而达到提高性能的目的数据库的性能。常用的分库分表中间件如下:6、什么是死锁?如何处理?死锁是指两个或多个事务在同一个资源上相互占用,并请求锁定对方的资源,从而形成恶性循环的现象。解决死锁的常用方法如果不同的程序并发访问多个表,尽量约定以相同的顺序访问这些表,这样可以大大减少死锁的机会。在同一个事务中,尽量一次性锁定所有需要的资源,减少死锁的概率;对于非常容易出现死锁的业务部分,可以尝试使用升级的锁定粒度,通过表级锁定来降低死锁产生的概率;如果业务处理不好,可以使用分布式事务锁或者使用乐观锁7、什么是脏读?幻读?不可重复读?脏读:一个事务更新了一条数据,此时另一个事务又读到了同一条数据。由于某些原因,前一个RollBack操作,后一个事务读取的数据将是不正确的。不可重复读(Non-repeatableread):一个事务的两次查询之间数据不一致。这可能是在两个查询过程中间插入的事务更新的原始数据。幻读:一个事务的两次查询中的数据项数量不一致。例如,一个事务查询几列(Row)数据,而另一个事务此时插入新的列数据。之前在事务的下一次查询中,你会发现有几列数据是它之前没有的。8.视图有什么特点?视图的特点如下:视图的列可以来自不同的表,是对表的抽象和逻辑意义上建立的新关系。视图是由基本表(实表)生成的表(虚表)。视图的建立和删除不影响基表。对视图内容的更新(添加、删除和修改)直接影响基础表。当视图来自多个基表时,不允许添加和删除数据。视图操作包括创建视图、查看视图、删除视图和修改视图。9、什么是SQL的生命周期?应用服务器与数据库服务器建立连接。数据库进程接收请求SQL,解析并生成执行计划,将数据读入内存并进行逻辑处理。通过第1步的连接,将结果发送给客户端关闭连接,释放资源。10.主键使用自增ID还是UUID?建议使用自增ID而不是UUID。因为在InnoDB存储引擎中,主键索引是作为聚簇索引存在的,也就是说主键索引和所有数据(按顺序)都存储在主键索引的B+树叶子节点上。如果主键索引是自增ID,那么只需要继续向后排列即可。如果是UUID,因为传入的ID和原始大小不确定,会造成大量的数据插入,数据移动,进而导致大量的内存碎片,导致插入性能下降。.总之,在数据量较大的情况下,使用自增主键的性能会更好。主键是聚集索引。如果没有主键,InnoDB会选择一个唯一键作为聚簇索引。如果没有唯一键,将生成一个隐式主键。11、MySQL数据库CPU飙升到100%怎么办?当cpu飙升到100%时,先用操作系统的top命令观察是否是mysqld占用导致的。如果不是,找出高占用进程并处理。如果是mysqld引起的,showprocesslist看有没有耗资源的sql在运行。找到高消耗的sql,查看执行计划是否准确,是否缺少索引,或者是数据过多导致的。一般来说,必须杀掉这些线程(同时观察cpu使用率是否下降),然后在做相应的调整(比如加索引、改sql、改内存参数)后重新运行这些SQL。也有可能每个sql并没有消耗多少资源,但是突然间,连接了大量的session,cpu飙升。这种情况下,就需要分析为什么连接数会随着应用激增,然后做出相应的调整。比如限制连接数等。12、MySQL主从复制解决什么问题?主从复制的作用是:如果主库出现问题,可以切换到从库。数据库级别的读写分离是可能的。可以在从数据库上执行每日备份。数据分布:随意启动或停止复制,将数据备份分布在不同的地理位置负载均衡:减轻单台服务器库的压力13、什么是MySQLGTID?TID(GlobalTransactionID,全局事务ID)是全局事务标识符,是一个已提交事务的编号,是一个全球唯一的编号。GTID是从MySQL5.6开始在主从复制中推出的重量级特性。GTID其实是由UUID+TID组成的。其中UUID是MySQL实例的唯一标识符。GTID表示实例上已提交的事务数,并随着事务提交单调增加。GTID有以下作用:根据GTID可以知道事务最初是在哪个实例上提交的。GTID的存在方便了Replication的Failover。因为不需要像传统模式复制那样去寻找master\_log\_file和master\_log\_pos。基于GTID构建主从复制更容易,保证每个事务只执行一次。14、MySQL常用的备份工具有哪些?常用备份工具mysqlcopy逻辑备份(mysqldump、mydumper)物理备份(copy、xtrabackup)备份工具比较:mysqlcopy与其他备份相比,获取更多的实时备份数据。逻辑备份:分表比较容易。备份数据时,mysqldump将所有的SQL语句整合到同一个文件中;使用mydumper备份数据时,SQL语句按照表拆分成单独的SQL文件,每个SQL文件对应一个完整的表。物理备份:副本立即可用,速度快。copy:直接将文件复制到数据目录下,可能会造成表损坏或数据不一致。xtrabackup对innodb表不需要锁表,但是对myisam表还是需要锁表。15.如何制定MySQL备份计划取决于数据库的大小。一般来说,100G以内的数据库,可以考虑使用mysqldump来做。因为mysqldump比较轻量灵活,备份时间选择在业务的非高峰期,每天全量进行即可。备份(mysqldump备份的文件比较小,压缩后更小)。对于100G以上的库,可以考虑使用xtranbackup,备份速度明显比mysqldump快。一般一周选择一次全量备份,其余时间每天做一次增量备份,备份时间在业务淡季。请在评论区指出文章中有关面试题的错误,我会进行更正和优化。如果文章对您有帮助,请给领导免费点个赞,谢谢。