当前位置: 首页 > 科技观察

掌握了这30道MySQL基础面试题,我成了面霸

时间:2023-03-21 22:59:54 科技观察

掌握了这30道基本的MySQL面试题,我就成了面孔高手为逻辑处理层提供数据查询功能支持。说到存储层就不得不说到数据库了,数据库知识的掌握也是面试的一个知识点。典型的服务架构数据库分为关系型数据库和非关系型数据库,也就是我们常说的SQL和NoSQL。数据库这两个方向的代表产品分别是MySQL和Redis。这次我们主要采用面试问答的形式。了解关系数据库MySQL的基础知识。面试开始,做好被面试官虐的准备吧!关系数据库什么是关系数据库?关系数据库是指使用关系模型来组织数据的数据库。它以行和列的形式存储数据,以便于用户理解。关系数据库的一系列行和列称为表,一组表组成了数据库。用户通过查询来检索数据库中的数据,查询是用于限制数据库中某些区域的可执行代码。简单来说,关系模式是一个二维表格模型。二维表数据库关系型数据库有什么优势?关系型数据库的优点:易于理解关系型二维表的结构非常接近现实世界,二维表易于理解。支持复杂查询您可以使用SQL语句轻松地在一张表和多张表之间进行非常复杂的数据查询。支持事务对事务进行可靠处理,保持事务的完整性,从而实现高安全性能的数据访问需求。什么是MySQL数据库SQL结构化查询语言(StructuredQueryLanguage)简称SQL,是一种专用编程语言,是一种数据库查询和编程语言编程语言,用于访问数据和查询、更新和管理关系数据库系统。什么是MySQL?MySQL是一个关系数据库管理系统。MySQL是最流行的关系数据库管理系统之一。常见的关系型数据库有Oracle、SQLServer、Access等。过去,MySQL以其高性能、低成本、可靠性好等特点成为最流行的开源数据库,被广泛应用于中小型网站在互联网上。mysql图标MySQL和MariaDB愚蠢地混淆了?MySQL最初是由瑞典公司MySQLAB开发的。MySQL的创始人是UlfMikaelWidnius,俗称Monty。被甲骨文公司收购后,现在是甲骨文公司(Oracle)的产品。甲骨文大幅提高了MySQL商业版的价格,这让自由软件社区开始担心甲骨文是否会继续支持MySQL社区版。MySQL的创始人是之前的大佬Monty,他建立了一个基于MySQL的分支计划MariaDB。MariaDB打算保持与MySQL的高度兼容性,确保与库二进制奇偶校验的直接替换,以及与MySQLAPI(应用程序编程接口)和命令的精确匹配。但是,一些原本使用MySQL的开源软件逐渐转向了MariaDB或者其他数据库。所以如果你看到你的公司用的是MariaDB,就不用怀疑了。事实上,它的核心仍然是MySQL。如果你学习MySQL,你就会知道MariaDB。彩蛋MariaDB是以Monty的小女儿Maria命名的,就像MySQL以他的另一个女儿My命名一样。两个著名的数据库分别以两个女儿的名字命名。你舅舅还是你舅舅,老头子厉害巴奇!MySQL之父如何查看MySQL当前版本号?系统命令行下:mysql-V连接MySQL命令行,输入:>status;Server:MySQLServerversion:5.5.45Protocolversion:10或者选择version();+--------------------------+|version()|+------------------------+|5.5.45-xxxxx|+-----------------------+基本数据类型MySQL有哪些数据类型?MySQL数据类型非常丰富,常用的类型简单介绍如下:整数类型:BIT、BOOL、TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT浮点数类型:FLOAT、DOUBLE、DECIMAL字符串类型:CHAR,VARCHAR,TINYTEXT,TEXT,MEDIUMTEXT,LONGTEXT,TINYBLOB,BLOB,MEDIUMBLOB,LONGBLOB日期类型:Date,DateTime,TimeStamp,Time,Year其他数据类型:BINARY,VARBINARY,ENUM,SET...CHAR和VARCHAR之间的区别?CHAR是定长字符类型,VARCHAR是变长字符类型。以下讨论均基于MySQL5.0及以上版本。共同点CHAR(M)和VARCHAR(M)都表示该列可以存储M个字符,注意不是字节!!CHAR类型特点CHAR最多可以存储255个字符(不是字节),字符有不同的编码集,比如UTF8编码(3字节),GBK编码(2字节)等。对于CHAR(M)如果实际存储的数据length小于M,MySQL会自动在右侧填充空格字符,但在检索操作中会去除那些填充的空格字符。VARCHAR类型特征VARCHAR的最大长度为65535字节。VARCHAR存储实际的字符串加上1或2个字节来记录字符串的实际长度。如果字符串长度小于255字节,则用1字节记录,如果字符串长度超过255,则需要2字节记录。[^12]VARCHAR(50)可以存储多少个UTF8编码的汉字?存储汉字数与版本有关。mysql4.0以下的版本,varchar(50)指的是50字节。如果存储UTF8格式编码的汉字(每个汉字占3个字节),则只能存储16个。对于mysql5.0及以上版本,varchar(50)指的是50个字符,无论存储的是数字、字母还是UTF8编码汉字,可存储50个汉字。int(10)和bigint(10)可以存储相同的数据大小吗?不一样,原因如下:int可以存储四字节有符号整数。bigint可以存储八字节有符号整数。因此,可以存储的数据大小不同,数字10只代表数据的显示宽度。[^13]显示宽度表示Mysql最多可以显示的数字个数。当数字位数小于指定宽度时,数字左边会用空格填充,而且空格不容易看出来。如果插入了大于显示宽度的值,只要不超出类型的取值范围,仍然可以插入并显示该值。如果在创建表格时指定了zerofill选项,不足显示宽度的部分将用0填充,为1则显示为0000000001。如果没有指定显示宽度,则默认宽度bigint的宽度是20,int的默认宽度是11。MySQL存储引擎的类型与存储引擎相关的有哪些?常用的存储引擎有InnoDB存储引擎和MyISAM存储引擎。InnoDB是MySQL默认的事务引擎。查看数据库表目前支持的引擎,可以使用如下查询语句查看:#查询结果表中的Engine字段表示存储引擎类型。showtablestatusfrom'your_db_name'wherename='your_table_name';InnoDB存储引擎的应用场景是什么?InnoDB是MySQL默认的“事务引擎”。它被设置为处理大量的短期交易。大多数短期事务都是正常提交??的,很少回滚。InnoDB存储引擎有什么特点?使用多版本并发控制(MVCC,MultiVersionConcurrencyControl)来支持高并发。它还实现了四个标准隔离级别,并通过gaplocknext-key锁定策略防止幻读。引擎表基于聚簇索引构建,对于主键查询具有高性能。但是它的二级索引非主键索引必须包含主键列,所以如果主键列很大,其他所有索引都会很大。因此,如果表上有很多索引,主键应该越小越好。此外,InnoDB的存储格式是平台无关的。InnoDB做了很多优化,例如:可预测的磁盘读取数据预读,自适应哈希索引(adaptivehashindex)自动在内存中创建哈希索引来加速读取操作,并且可以加快插入操作插入缓冲区(insertbuffer)等。InnoDB通过一些机制和工具支持真正的热备份。MySQL的其他存储引擎不支持热备份。要获得一致的视图,有必要停止写入所有表。在读写混合场景下,停止写入也可能意味着停止读取。InnoDB引擎的四大特点是什么?插入缓冲区(Insertbuffer)InsertBuffer用于非聚集索引的插入和更新操作。首先判断插入的非聚集索引是否在缓冲池中,如果是则直接插入,否则插入到InsertBuffer对象中。然后按一定频率对InsertBuffer和辅助索引的叶子节点进行合并操作,将多次插入合并为一次操作,提高非聚集索引的插入性能。双写(Doublewrite)双写由两部分组成,一部分是内存中的双写缓冲区,大小为2MB,另一部分是物理磁盘上共享表空间中的128个连续页,大小为也是2MB。刷新缓冲池中的脏页时,并没有直接将脏页写入磁盘,而是先通过memcpy函数将脏页复制到内存中的这个区域,然后通过doublewritebuffer分成两份,每次依次写入1MB到共享表空间的物理磁盘上,然后立即调用fsync函数同步磁盘,避免操作系统缓冲区写入带来的问题。自适应哈希索引(AdaptiveHashIndex)InnoDB会根据访问的频率和方式为热点页面构建哈希索引,以提高查询效率。索引由缓存池的B+树页构建,因此建立速度非常快。InnoDB存储引擎将监视表上每个索引页上的查询。如果观察到建立哈希索引可以带来速度的提升,那么就建立哈希Hash索引,所以称为自适应哈希索引。缓冲池为了提高数据库的性能,引入了缓冲池的概念。缓冲池的大小可以通过参数innodb_buffer_pool_size设置,缓冲池的实例数可以通过参数innodb_buffer_pool_instances设置。缓冲池主要用于存储以下内容:缓冲池中缓存的数据页类型包括:索引页、数据页、撤销页、插入缓冲区、自适应哈希索引以及InnoDB存储的锁信息(lockinfo)和数据字典信息(datadictionary)。MyISAM存储引擎的应用场景有哪些?MyISAM是MySQL5.1及更早版本的默认存储引擎。MyISAM提供了大量的特性,包括全文索引、压缩、空间函数(GIS)等,但MyISAM并不“支持事务和行级锁”。对于只读数据,或者表比较小,可以容忍修复操作,还是可以用的。MyISAM存储引擎有哪些特点?MyISAM“不支持行级锁,而是锁住整个表”。读的时候会在所有需要读的表上加共享锁,写的时候会在表上加排他锁。但是,在表有读操作的同时,也可以向表中插入新记录,这称为并发插入。可以手动或自动检查和修复MyISAM表。但与事务恢复和崩溃恢复不同的是,可能会导致一些“数据丢失”,而且恢复操作非常缓慢。对于MyISAM表,即使是BLOB和TEXT等长字段也可以根据前500个字符进行索引。MyISAM还支持“全文索引”,这是一种基于分词创建的索引,可以支持复杂的查询。如果指定了DELAY_KEY_WRITE选项,修改后的索引数据不会在每次修改执行后立即写入磁盘,而是写入内存中的keybuffer,只有在清理keybuffer或关闭表时才会写入相应的索引块被写入磁盘。这种方法可以大大提高写入性能,但是当数据库或主机崩溃时,会造成“索引损坏”,需要进行修复操作。MyISAM和InnoDB存储引擎5大区别InnoDB支持事物,但MyISAM不支持事物InnoDB支持行级锁,而MyISAM支持表级锁InnoDB支持MVCC,但MyISAM不支持InnoDB支持外键,而MyISAM不支持不支持InnoDB不支持全文索引,而MyISAM支持一张表简单列出两个引擎的主要区别,如下图:mysql引擎执行SELECTCOUNT(*)哪个引擎更快?SELECTCOUNT(*)常用于统计一个表的总行数,在MyISAM存储引擎中执行速度更快,前提是不加WHERE条件。这是因为MyISAM对表的行数进行了优化,内部使用了一个变量来存储表的行数。如果查询条件没有WHERE条件,就是查询表中有多少条数据。MyISAM可以快速返回结果。如果添加WHERE条件将不起作用。InnoDB表还有一个存储表行数的变量,但是这个值是一个估计值,所以没有太大的实际意义。MySQL基础知识,数据库设计的三大范式是什么?1Paradigm:1NF是对属性的原子约束,要求属性是原子的,不能分解;(只要关系型数据库满足1NF)2范式:2NF是对记录的唯一约束,要求记录具有唯一标识,即实体的唯一性;3范式:3NF是对字段冗余的约束,即任何字段都不能从其他字段派生,要求字段不冗余。可以进行无冗余的数据库设计。但是,没有冗余的数据库不一定是最好的数据库。有时为了提高运行效率,需要降低范式标准,适当保留冗余数据。具体做法是:在概念数据模型设计中遵守第三范式时,在物理数据模型的设计中要考虑降低范式标准的工作。降低标准形式意味着增加字段并允许冗余。SQL语句有哪些分类?DDL:数据定义语言(createalterdrop)DML:数据操作语句(insertupdatedelete)DTL:数据事务语句(commitcallbacksavapoint)DCL:数据控制语句(grantrevoke)数据库中delete、drop、truncate的区别删除操作在哪里?当表不再需要时,可以使用drop删除表;当你仍然想保留表,但删除所有记录时,使用truncate删除表中的记录。当要删除某些记录时(一般有WHERE子句约束),使用delete删除表中的某些记录。什么是MySql视图?视图是不存储数据的虚拟表,只包含定义时语句的动态数据。创建视图语法:CREATE[ORREPLACE][ALGORITHM={UNDEFINED|MERGE|TEMPTABLE}][DEFINER=user][SQLSECURITY{DEFINER|INVOKER}]VIEWview_name[(column_list)]ASselect_statement[WITH[CASCADED|LOCAL]CHECKOPTION]参数说明:ORREPLACE:如果视图存在,则替换现有视图。ALGORITHM:查看选择算法,默认算法为UNDEFINED(未定义),MySQL自动选择要使用的算法。DEFINER:指定视图创建者或定义者。如果未指定此选项,则创建视图的用户是定义者。SQLSECURITY:SQL安全,默认为DEFINER。select_statement:为视图创建SELECT语句,可以从基表或其他视图中选择数据。WITHCHECKOPTION:表示视图在更新时保证约束,默认为CASCADED。使用MySQL视图有什么优点?操作简单方便。视图用户无需关心视图对应的表结构、关联条件、过滤条件。对于用户来说,已经是复合条件的过滤结果集。数据更安全。视图用户只能访问视图中的结果集,视图可以限制对表的某些行和列的访问。数据隔离。屏蔽源表结构变化对用户的影响,源表结构变化时视图结构保持不变。^1MySql服务的默认端口号是多少?默认端口为3306查看端口命令:>showvariableslike'port';使用DISTINCT过滤多列的规则?DISTINCT用于对选中的数据进行去重,单列用法简单易懂。例如有如下数据表tamb:namenumberTencent1Alibaba2Bytedance3Meituan3查询语句:SELECTDISTINCTnameFROMtabletamb结果如下:nameTencentAlibabaBytedanceMeituan如果要对number列进行去重,同时显示name,可以写一个查询statement:SELECTDISTINCTnumber,nameFROMtabletambwithmultipleparametersDISTINCT去重规则是:把DISTINCT后面的所有参数都当作过滤条件,也就是说对(number,name)进行整体去重,只有当组合不同,将执行重复数据删除。结果如下:numbername1Tencent2Alibaba3Bytedance3Meituan从结果来看似乎并没有达到我们想要的去重效果,那么如何实现“同时按number列和displayname去重”呢?可以使用GroupBy语句:SELECTnumber,nameFROMtabletambGROUPBYnumber输出结果如下,正是我们想要的:numbername1Tencent2Alibaba3Bytedance什么是存储过程?一个或多个SQL语句的集合具有以下特点:存储过程可以实现更快的执行速度。存储过程可以用流程控制语句编写,具有很强的灵活性,可以完成复杂的判断和复杂的操作。存储过程可以用作安全机制。存储过程可以减少网络流量delimiterdelimitercreateprocedure|procproc_name()beginsqlstatementenddelimiterdelimiter;--恢复分隔符,为了不影响后面语句的使用--默认分隔符为;但是为了能够在整个存储过程中使用,所以一般需要自定义分隔符(\除外)存储过程和函数好像很相似,请问他们有什么区别?存储过程和函数是预先编译并存储在数据库中的SQL语句的集合。调用存储过程和函数可以为应用开发者简化很多工作,减少数据库和应用服务器之间的数据传输。提高数据处理效率是有益的。相似之处存储过程和函数是用于可重复执行数据库操作的SQL语句的集合。存储过程和函数编译一次后缓存,下次使用时直接打编译好的SQL语句,减少网络交互,提高效率。区别在于标识不同,函数的标识是function,存储过程的标识是procedure。函数返回单个值或表对象,而存储过程不返回值,但可以通过OUT参数返回多个值。对函数的限制比较多,比如不能使用临时表,只能使用表变量,不能使用某些函数等,而存储过程的限制相对较少。一般来说,存储过程实现的功能比较复杂,而函数实现的功能比较具体。函数的参数只能是IN类型,存储过程的参数可以是三种类型:INOUTINOUT。存储函数使用select调用,存储过程需要使用call调用。综上所述,本文是MySQL系列的第二篇。它以面试问答的形式总结了一系列面试中常见的基础知识点。都是很基础的内容,但是越基础越重要。建议收藏为知识点笔记(据说可以分享,自己看看效果更好),经常拿出来温故知新,MySQL系列的知识点有散而庞大,本文为基础篇,更多MySQL系列文章等你来。稍微细心的读者可能会发现,距离上次更新已经一个多星期了,而我这一个多星期也没有偷懒写文章。上周我出差太忙了。一般来说,技术人员不需要出差。这一次,作为唯一的技术人员,比较特殊。从机场回来的那天晚上下雨,深圳的航班延误了。抵达深圳时已接近晚上十点。我冒雨打车赶回住处。回来的时候打算写一篇文章。我发现电脑打不开。我想知道它是否在安全检查时被阻止了。红外辐射???这让我重新安装了电脑。幸运的是,我之前写的一半文章都放在了github上。