前言
最近正在找工作背八股文,然而sql又是经常被问到的高频问题,这里记录下我这些天面试被问到的一些问题和不详细的一些答案,欢迎大家来一起讨论
一、常见问题?
1.索引的创建的原则有那些
2.什么时候索引会失效
3.sql优化
4.事务的特性
undolog
用来事务还原的
redolog如果服务器宕机再恢复到电脑中
二、提升问题
1.mysql insert的优化
2.explain查询sql过慢 问题
mysql中explain的字段含义_mysql explain 字段含义-优快云博客
3.mysql命令执行后底层是怎么运行的
MySQL命令在底层的运行涉及到多个组件和层次,从用户输入的SQL命令到最终的数据操作,大致可以分为以下几个步骤:
1.
客户端连接:
用户通过命令行工具、图形界面工具或编程语言中的MySQL客户端库连接到MySQL服务器。客户端发送连接请求,服务器响应并建立连接。
2.
SQL命令解析:
客户端发送的SQL命令到达服务器后,首先由服务器的SQL解析器进行解析。解析器会检查SQL语句的语法正确性,并将其转换为内部的数据结构,这个结构通常称为解析树(parse tree)或查询树(query tree)。
3.
查询优化:
解析器生成的内部结构随后被传递给查询优化器。优化器会根据存储引擎提供的统计信息、索引信息和表结构等,决定执行SQL命令的最优策略。这包括选择使用哪个索引、连接表的顺序、是否使用临时表等。
4.
执行计划生成:
优化器生成一个执行计划,这个计划详细描述了如何执行SQL命令。执行计划包括一系列的操作步骤,如表扫描、索引查找、排序、连接等。
5.
存储引擎操作:
执行计划被传递给存储引擎。MySQL支持多种存储引擎,如InnoDB、MyISAM等,每种存储引擎都有自己的数据存储和操作方式。存储引擎负责实际的数据读写操作,如数据的插入、更新、删除和查询。
6.
结果返回:
存储引擎执行完操作后,将结果返回给服务器。服务器将结果集格式化后,通过网络发送回客户端。
7.
客户端处理:
客户端接收到结果后,根据需要进行处理,如显示在用户界面上或进行进一步的逻辑处理。
整个过程是高度自动化的,用户通常只需要输入SQL命令,而不需要关心底层的具体实现细节。MySQL的这种设计使得它能够高效地处理大量的数据操作请求。
4.myslq的锁
MySQL中的锁机制是数据库管理系统为了保证数据的一致性和完整性而设计的一种并发控制机制。MySQL支持多种类型的锁,包括表级锁、行级锁和页级锁,以及不同类型的锁模式,如共享锁、排他锁、意向锁等。以下是MySQL锁机制的详细介绍:
锁的类型
1.
表级锁:
- 共享锁(S锁):允许多个事务读取同一张表,但不允许写入。
- 排他锁(X锁):不允许其他事务读取或写入当前表。
2.
行级锁:
- 共享锁(S锁):允许多个事务读取同一行数据,但不允许写入。
- 排他锁(X锁):不允许其他事务读取或写入当前行数据。
3.
页级锁:
- 介于表级锁和行级锁之间的一种锁,锁定粒度介于两者之间。
意向锁
- 意向共享锁(IS锁):表示事务准备给数据行加入共享锁,用于多粒度锁的兼容性检测。
- 意向排他锁(IX锁):表示事务准备给数据行加入排他锁。
锁的兼容性
锁的兼容性是指不同事务对同一资源加锁时的相互影响。例如,共享锁与共享锁兼容,但与排他锁不兼容。
锁的粒度
锁的粒度是指锁定数据的范围大小。粒度越小,锁定的范围越精确,但开销越大;粒度越大,锁定的范围越大,但开销越小。
锁的算法
- 记录锁(Record Lock):锁定单个行记录。
- 间隙锁(Gap Lock):锁定一个范围,但不包含记录本身。
- 临键锁(Next-Key Lock):记录锁+间隙锁,锁定一个范围,并且锁住记录本身。
- 插入意向锁(Insert Intention Lock):在多事务同时写入不同数据至同一索引间隙的时候,并不需要等待其他事务完成。
- 自增锁(Auto-inc Lock):一种特殊的表级锁,发生在AUTO_INCREMENT约束下的插入操作。
死锁
死锁是指两个或多个事务在同一个资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环的现象。MySQL通过死锁检测和死锁超时机制来处理死锁问题。
锁的使用场景
- MyISAM存储引擎:主要使用表级锁,适合读多写少的场景。
- InnoDB存储引擎:支持行级锁和表级锁,适合高并发的OLTP应用。
锁的管理
- SHOW STATUS LIKE 'table%';:查看表的锁情况。
- SHOW OPEN TABLES;:查看表的锁情况,0表示未上锁,1表示上锁。
锁的优化
- 减少锁的粒度:使用行级锁代替表级锁。
- 合理安排事务顺序:避免死锁的发生。
- 使用索引:减少锁的范围。
5.行锁和表锁的优缺点
在MySQL中,行锁和表锁各有其适用场景和优缺点,选择哪种锁取决于具体的业务需求和性能要求。以下是行锁和表锁的比较:
行锁(Row-level Locking)
优点:
- 高并发性:不同事务可以同时锁定不同的行,提高了数据库的并发性能。
- 精确控制:只锁定需要操作的行,避免了无谓的锁竞争,降低了锁冲突的概率。
- 减少锁冲突:在高并发场景下,行锁可以减少锁冲突,因为锁定的范围更小。
缺点:
- 内存消耗:行锁需要维护每一行的锁信息,会占用一定的内存空间。
- 性能开销:锁管理的细粒度导致了额外的性能开销,例如死锁检测等。
- 锁竞争:当大量事务同时访问不同行时,仍然可能出现锁竞争问题。
表锁(Table-level Locking)
优点:
- 简单实现:实现相对简单,不需要维护大量的锁信息。
- 节省内存:只需要维护表级的锁信息,节省了内存开销。
- 减少死锁:表锁的使用减少了死锁的可能性,因为锁的粒度较大。
缺点:
- 低并发性:表锁限制了并发性,当一个事务锁定了表后,其他事务无法并行访问。
- 锁竞争:表级锁导致多个事务之间的锁竞争增加,可能出现更多的死锁问题。
- 性能瓶颈:在高并发情况下,表级锁可能成为性能瓶颈,限制了系统的吞吐量。
如何选择
- 行锁:适用于高并发、细粒度的操作,能够提供更好的并发性能,但可能会引入更多的锁管理开销。
- 表锁:适用于简单的操作,能够减少锁管理开销,但并发性能较差。
综合考虑,通常情况下优先选择行锁,只有在特定情况下(例如大量的读操作或简单的数据操作)才考虑使用表锁❸。
在实际应用中,可以根据具体情况进行权衡和调整。例如,如果业务场景中需要频繁更新同一张表中的不同行,且这些行之间没有直接的关联,那么行锁可能是更好的选择。相反,如果业务场景中主要是进行简单的查询操作,且对并发要求不高,那么表锁可能是更合适的选择。
最后,需要注意的是,InnoDB存储引擎支持行级锁定和表级锁定,而MyISAM存储引擎只支持表级锁定。因此,选择哪种锁也与所使用的存储引擎有关
6.mvcc机制
总结
我觉得常见的大概就那么多,希望这个文章对你sql的面试会有帮助