MySQL 面试题

木村牧村 2019-09-02 16:03:33 19673 收藏 702

分类专栏: 面试题 文章标签: mysql面试题
最后发布:2019-09-02 16:03:33首次发布:2019-09-02 16:03:33
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/a303549861/article/details/100302267

版权

MySQL 面试题

MySQL 涉及的内容非常非常非常多,所以面试题也容易写的杂乱。当年,我们记着几个一定要掌握的重心:

重点的题目添加了【重点】前缀。

  1. 索引。
  2. 锁。
  3. 事务和隔离级别。

因为 MySQL 还会有部分内容和运维相关度比较高,所以本文我们分成两部分【开发】【运维】两部分。

  • 对于【开发】部分,我们需要掌握。
  • 对于【运维】部分,更多考验开发的知识储备情况,当然能回答出来是比较好的,特别是对于高级开发工程师、架构师等。

开发

为什么互联网公司一般选择 MySQL 而不是 Oracle?

免费、流行、够用。

? 当然,这个回答要稍微润色下。不过一般,很少问这个问题了。

数据库的三范式是什么?什么是反模式?

艿艿:重点在于反模式的回答。实际开发中,不会严格遵守三范式。

胖友直接看 《服务端指南 数据存储篇 | MySQL(07) 范式与反模式》 。

MySQL 有哪些数据类型?

MySQL 支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。具体可以看看 《MySQL 数据类型》 文档。

  • 正确的使用数据类型,对数据库的优化是非常重要的。

? MySQL 中 varchar 与 char 的区别?varchar(50) 中的 50 代表的涵义?

  • 1、varchar 与 char 的区别,char 是一种固定长度的类型,varchar 则是一种可变长度的类型。
  • 2、varchar(50) 中 50 的涵义最多存放 50 个字符。varchar(50) 和 (200) 存储 hello 所占空间一样,但后者在排序时会消耗更多内存,因为 ORDER BY col 采用 fixed_length 计算 col 长度(memory引擎也一样)。所以,实际场景下,选择合适的 varchar 长度还是有必要的。

? int(11) 中的 11 代表什么涵义?

int(11) 中的 11 ,不影响字段存储的范围,只影响展示效果。具体可以看看 《MySQL 中 int 长度的意义》 文章。

? 金额(金钱)相关的数据,选择什么数据类型?

  • 方式一,使用 int 或者 bigint 类型。如果需要存储到分的维度,需要 *100 进行放大。
  • 方式二,使用 decimal 类型,避免精度丢失。如果使用 Java 语言时,需要使用 BigDecimal 进行对应。

? 一张表,里面有 ID 自增主键,当 insert 了 17 条记录之后,删除了第 15,16,17 条记录,再把 MySQL 重启,再 insert 一条记录,这条记录的 ID 是 18 还是 15?

  • 一般情况下,我们创建的表的类型是 InnoDB ,如果新增一条记录(不重启 MySQL 的情况下),这条记录的 ID 是18 ;但是如果重启 MySQL 的话,这条记录的 ID 是 15 。因为 InnoDB 表只把自增主键的最大 ID 记录到内存中,所以重启数据库或者对表 OPTIMIZE 操作,都会使最大 ID 丢失。
  • 但是,如果我们使用表的类型是 MyISAM ,那么这条记录的 ID 就是 18 。因为 MyISAM 表会把自增主键的最大 ID 记录到数据文件里面,重启 MYSQL 后,自增主键的最大 ID 也不会丢失。

最后,还可以跟面试官装个 x ,生产数据,不建议进行物理删除记录。

? 表中有大字段 X(例如:text 类型),且字段 X 不会经常更新,以读为为主,请问您是选择拆成子表,还是继续放一起?写出您这样选择的理由

  • 拆带来的问题:连接消耗 + 存储拆分空间。

    如果能容忍拆分带来的空间问题,拆的话最好和经常要查询的表的主键在物理结构上放置在一起(分区) 顺序 IO ,减少连接消耗,最后这是一个文本列再加上一个全文索引来尽量抵消连接消耗。

  • 不拆可能带来的问题:查询性能。

    如果能容忍不拆分带来的查询性能损失的话,上面的方案在某个极致条件下肯定会出现问题,那么不拆就是最好的选择。

实际场景下,例如说商品表数据量比较大的情况下,会将商品描述单独存储到一个表中。即,使用拆的方案。

MySQL 有哪些存储引擎?

MySQL 提供了多种的存储引擎:

  • InnoDB
  • MyISAM
  • MRG_MYISAM
  • MEMORY
  • CSV
  • ARCHIVE
  • BLACKHOLE
  • PERFORMANCE_SCHEMA
  • FEDERATED

具体每种存储引擎的介绍,可以看看 《数据库存储引擎》 。

? 如何选择合适的存储引擎?

提供几个选择标准,然后按照标准,选择对应的存储引擎即可,也可以根据 常用引擎对比 来选择你使用的存储引擎。使用哪种引擎需要根据需求灵活选择,一个数据库中多个表可以使用不同的引擎以满足各种性能和实际需求。使用合适的存储引擎,将会提高整个数据库的性能。

  1. 是否需要支持事务。

  2. 对索引和缓存的支持。

  3. 是否需要使用热备。

  4. 崩溃恢复,能否接受崩溃。

  5. 存储的限制。

  6. 是否需要外键支持。

    艿艿:目前开发已经不考虑外键,主要原因是性能。具体可以看看 《从 MySQL 物理外键开始的思考》 文章。

目前,MySQL 默认的存储引擎是 InnoDB ,并且也是最主流的选择。主要原因如下:

  • 【最重要】支持事务。
  • 支持行级锁和表级锁,能支持更多的并发量。
  • 查询不加锁,完全不影响查询。
  • 支持崩溃后恢复。

在 MySQL5.1 以及之前的版本,默认的存储引擎是 MyISAM ,但是目前已经不再更新,且它有几个比较关键的缺点:

  • 不支持事务。
  • 使用表级锁,如果数据量大,一个插入操作锁定表后,其他请求都将阻塞。

艿艿:也就是说,我们不需要花太多力气在 MyISAM 的学习上。

? 请说明 InnoDB 和 MyISAM 的区别

InnoDB MyISAM
事务 支持 不支持
存储限制 64TB
锁粒度 行锁 表锁
崩溃后的恢复 支持 不支持
外键 支持 不支持
全文检索 5.7 版本后支持 支持

更完整的对比,可以看看 《数据库存储引擎》 的 「常用引擎对比」 小节。

? 请说说 InnoDB 的 4 大特性?

艿艿:貌似我面试没被问过…反正,我是没弄懂过~~

  • 插入缓冲(insert buffer)
  • 二次写(double write)
  • 自适应哈希索引(ahi)
  • 预读(read ahead)

? 为什么 SELECT COUNT(*) FROM table 在 InnoDB 比 MyISAM 慢?

对于 SELECT COUNT(*) FROM table 语句,在没有 WHERE 条件的情况下,InnoDB 比 MyISAM 可能会慢很多,尤其在大表的情况下。因为,InnoDB 是去实时统计结果,会全表扫描;而 MyISAM 内部维持了一个计数器,预存了结果,所以直接返回即可。

详细的原因,胖友可以看看 《高性能 MySQL 之 Count 统计查询》 博客。

? 各种不同 MySQL 版本的 Innodb 的改进?

艿艿:这是一个选择了解的问题。

MySQL5.6 下 Innodb 引擎的主要改进:

  1. online DDL
  2. memcached NoSQL 接口
  3. transportable tablespace( alter table discard/import tablespace)
  4. MySQL 正常关闭时,可以 dump 出 buffer pool 的( space, page_no),重启时 reload,加快预热速度
  5. 索引和表的统计信息持久化到 mysql.innodb_table_stats 和 mysql.innodb_index_stats,可提供稳定的执行计划
  6. Compressed row format 支持压缩表

MySQL5.7 下 Innodb 引擎的主要改进:

  • 1、修改 varchar 字段长度有时可以使用

    这里的“有时”,指的是也有些限制。可见 《MySQL 5.7 online ddl 的一些改进》 。

  • 2、Buffer pool 支持在线改变大小

  • 3、Buffer pool 支持导出部分比例

  • 4、支持新建 innodb tablespace,并可以在其中创建多张表

  • 5、磁盘临时表采用 innodb 存储,并且存储在 innodb temp tablespace 里面,以前是 MyISAM 存储

  • 6、透明表空间压缩功能

重点】什么是索引?

索引,类似于书籍的目录,想找到一本书的某个特定的主题,需要先找到书的目录,定位对应的页码。

MySQL 中存储引擎使用类似的方式进行查询,先去索引中查找对应的值,然后根据匹配的索引找到对应的数据行。

? 索引有什么好处?

  1. 提高数据的检索速度,降低数据库IO成本:使用索引的意义就是通过缩小表中需要查询的记录的数目从而加快搜索的速度。
  2. 降低数据排序的成本,降低CPU消耗:索引之所以查的快,是因为先将数据排好序,若该字段正好需要排序,则正好降低了排序的成本。

? 索引有什么坏处?

  1. 占用存储空间:索引实际上也是一张表,记录了主键与索引字段,一般以索引文件的形式存储在磁盘上。
  2. 降低更新表的速度:表的数据发生了变化,对应的索引也需要一起变更,从而减低的更新速度。否则索引指向的物理数据可能不对,这也是索引失效的原因之一。

? 索引的使用场景?

  • 1、对非常小的表,大部分情况下全表扫描效率更高。

  • 2、对中大型表,索引非常有效。

  • 3、特大型的表,建立和使用索引的代价随着增长,可以使用分区技术来解决。

    实际场景下,MySQL 分区表很少使用,原因可以看看 《互联网公司为啥不使用 MySQL 分区表?》 文章。

    对于特大型的表,更常用的是“分库分表”,目前解决方案有 Sharding Sphere、MyCAT 等等。

? 索引的类型?

索引,都是实现在存储引擎层的。主要有六种类型:

  • 1、普通索引:最基本的索引,没有任何约束。

  • 2、唯一索引:与普通索引类似,但具有唯一性约束。

  • 3、主键索引:特殊的唯一索引,不允许有空值。

  • 4、复合索引:将多个列组合在一起创建索引,可以覆盖多个列。

  • 5、外键索引:只有InnoDB类型的表才可以使用外键索引,保证数据的一致性、完整性和实现级联操作。

  • 6、全文索引:MySQL 自带的全文索引只能用于 InnoDB、MyISAM ,并且只能对英文进行全文检索,一般使用全文索引引擎。

    常用的全文索引引擎的解决方案有 Elasticsearch、Solr 等等。最为常用的是 Elasticsearch 。

具体的使用,可以看看 《服务端指南 数据存储篇 | MySQL(03) 如何设计索引》 。

? MySQL 索引的“创建”原则?

注意,是“创建”噢。

  • 1、最适合索引的列是出现在 WHERE 子句中的列,或连接子句中的列,而不是出现在 SELECT 关键字后的列。

  • 2、索引列的基数越大,索引效果越好。

    具体为什么,可以看看如下两篇文章:

    • 《MySQL 索引基数》 理解相对简单
    • 《低基数索引为什么会对性能产生负面影响》 写的更原理,所以较为难懂。
  • 3、根据情况创建复合索引,复合索引可以提高查询效率。

    因为复合索引的基数会更大。

  • 4、避免创建过多的索引,索引会额外占用磁盘空间,降低写操作效率。

  • 5、主键尽可能选择较短的数据类型,可以有效减少索引的磁盘占用提高查询效率。

  • 6、对字符串进行索引,应该定制一个前缀长度,可以节省大量的索引空间。

? MySQL 索引的“使用”注意事项?

注意,是“使用”噢。

  • 1、应尽量避免在 WHERE 子句中使用 !=<> 操作符,否则将引擎放弃使用索引而进行全表扫描。优化器将无法通过索引来确定将要命中的行数,因此需要搜索该表的所有行。

    注意,column IS NULL 也是不可以使用索引的。

  • 2、应尽量避免在 WHERE 子句中使用 OR 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:SELECT id FROM t WHERE num = 10 OR num = 20

  • 3、应尽量避免在 WHERE 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。

  • 4、应尽量避免在 WHERE 子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。

  • 5、不要在 WHERE 子句中的 = 左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。

  • 6、复合索引遵循前缀原则。

  • 7、如果 MySQL 评估使用索引比全表扫描更慢,会放弃使用索引。如果此时想要索引,可以在语句中添加强制索引。

  • 8、列类型是字符串类型,查询时一定要给值加引号,否则索引失效。

  • 9、LIKE 查询,% 不能在前,因为无法使用索引。如果需要模糊匹配,可以使用全文索引。

关于这块,可以看看 《服务端指南 数据存储篇 | MySQL(04) 索引使用的注意事项》 文章,写的更加细致。

? 以下三条 SQL 如何建索引,只建一条怎么建?

WHERE a = 1 AND b = 1
WHERE b = 1
WHERE b = 1 ORDER BY time DESC


http://www.taodudu.cc/news/show-2777557.html

相关文章:

  • 阻塞队列(三):DelayQueue
  • 销毁铸造均衡Token的分析 - Helium
  • Pytorch简单一览表
  • 怎么做革命性创新产品
  • android --------- Android10系统上访问本地相机下的视频文件报错 /storage/emulated/0/DCIM/Camera/ open failed: EACCES
  • 言承旭签约尊尼事务所 变木村拓哉师弟攻日本
  • redis 在32位系统安装以及使用
  • 如何给mac重做系统
  • Manjaro更换系统默认字体,主题
  • Android主题颜色和字体设置
  • VScode主题字体(正体,斜体修改)
  • C++——VS2019调整字体和主题
  • IDEA炫酷的主题字体颜色设置
  • 如何在jupyter notebook 中修改主题、字体、字号等
  • wordpress 替换国外主题字体为微软雅黑
  • Android Studio 主题 字体
  • Vivado 自定义暗黑色主题字体、颜色,复用自定义主题。文末附黑色主题设置文件
  • 如何设置 IntelliJ IDEA 主题和字体
  • Intellij IDEA更换主题,配置字体
  • IDEA主题配置--- 炫酷的主题字体颜色设置(基于Intellij IDEA 2018)
  • 最简单优雅修改jupyter自带主题字体大小颜色(不需要插件不需要第三方theme)
  • 【 IntelliJ IDEA 】设置主题和字体
  • 解决Tabby终端使用zsh主题字体无法识别问题
  • python jupyter notebook怎么调字体大小_配置Jupyter的代码主题 字体以及字体大小 代码自动补全...
  • sublime text3 字体样式_Sublime Text3 Github最受欢迎主题字体推荐!
  • idea修改回默认字体_设置 IntelliJ IDEA 主题和字体的方法
  • IDEA优化配置(6)--- 炫酷的主题字体颜色设置(基于Intellij IDEA 2018)
  • IDEA 界面主题字体修改
  • typora修改主题字体、代码块字体、行内块代码字体大小、引用块字体大小、代码块背景颜色、文章可写区域宽度以及修改教程
  • 修改 Windows 10 主题字体

扩展:收藏网上胖友的面试题相关推荐

  1. 职称计算机考试用友u8试题答案,2013年职称计算机考试用友U8模拟试题及答案(8)...

    无忧考网为大家收集整理了<2013年职称计算机考试用友U8模拟试题及答案(8)>供大家参考,希望对大家有所帮助!!! 1.总账系统的日常业务处理包括( ). A.结账 B.填制凭证 C.凭 ...

  2. 写了一个 SSO 单点登录的代码示例给胖友!

    发危~ " 摘要: 原创出处 http://www.iocoder.cn/Spring-Security/OAuth2-learning-sso/ 「芋道源码」欢迎转载,保留摘要,谢谢! 1 ...

  3. 人民银行招聘考试计算机类真题,中国人民银行招聘计算机类笔试试题大全(多套试题包含答案,考友经验分享试题分析,最全整理资料).doc...

    中国人民银行招聘计算机类笔试试题大全(多套试题包含答案,考友经验分享试题分析,最新最全整理资料) 简介:文档包含了多套中国人民银行计算机类笔试模拟题含答案,中国人民银行计算机类考试笔,2006年到20 ...

  4. 源码圈 300 胖友的书单整理

    2019独角兽企业重金招聘Python工程师标准>>> ???关注**微信公众号:[芋道源码]**有福利: RocketMQ / MyCAT / Sharding-JDBC 所有源码 ...

  5. 收藏 | 75道常见AI面试题助你清扫知识盲点(附解析)

    来源:授权自AI科技大本营(ID:rgznai100) 本文干货多,建议收藏. 本文精心准备了一份AI相关岗位的面试题,帮大家扫清知识盲点,自信上场! [ 导读 ]正值求职.跳槽季,无论你是换工作还是 ...

  6. 基于PHP网上考试系统,试卷、试题——基于php网上考试系统.doc

    试卷.试题--基于php网上考试系统.doc 学 生 姓 名 ______ ______ 学 号 ____ 班 级 _ __ __ 所属院(系)__ 指 导 教 师 ______ 2014 年11 月 ...

  7. 网上整理的google面试题

    1.1024! 末尾有多少个0? 末尾0的个数取决于乘法中因子2和5的个数.显然乘法中因子2的个数大于5的个数,所以我们只需统计因子5的个数. 是5的倍数的数有: 1024 /5 = 204个 是25 ...

  8. 用友java面试题_用友网络科技Java高级开发面试题(2019)

    面试岗位:Java高级开发 面试形式:电话面试 这些天在boss上逛了下,看见北京Java开发工资比较诱人,便萌生了去北京的想法,做一名北漂的程序猿.约了几家面试,由于是异地,当然优先电话面了.本篇记 ...

  9. 值得收藏的 104个 CSS 面试题

    给大家分享104个 CSS 面试题,助你查漏补缺.有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助 CSS 面试知识点总结 最近在整理 CSS 的时候发现遇到了很多面试中常见的面试题,本 ...

最新文章

  1. 网络yum网址:http://mirrors.163.com/.help/
  2. 跨物种脑-脑连接!听障人士通过豚鼠大脑听到了声音 | Nature
  3. CDH-5.7.1离线安装
  4. 如何利用数据分析找到女朋友?
  5. 浏览器打不开python的页面_robotframework,selenium启动不了打不开浏览器的问题访问不了网页...
  6. java 多线程——一个定时调度的例子
  7. vue 自定义组件的自定义属性
  8. java项目文档管理_基于jsp的文档管理系统-JavaEE实现文档管理系统 - java项目源码...
  9. Linux 如何配置 SFTP 来代替单一ftp应用
  10. IMO船舶材料防火安全规范
  11. 相亲交友小程序开发方案及源码
  12. 一款简单的取色器:ObtainColor拾色器
  13. 通过统计7万多真实人名生成可信的随机人名
  14. 实习生去公司都干些啥
  15. linux 模拟误码率,基于System View的比特误码率测试的仿真研究
  16. 【毕业季·进击的技术er】青春不散场
  17. 一图读懂 | “数据二十条”
  18. 软件生命周期管理系统ALM配置说明(二)
  19. 提取视频关键帧和关键帧的时间点信息
  20. python在循环中创建dataframe(如df1、df2……)

热门文章

  1. 学生党matlab哪个版本最好用,学生党福音!仅4个GPU打造自己的BigGAN,PyTorch代码已开源...
  2. 加密聊天应用依然安全
  3. Kmeans聚类分析
  4. 华为S5700-SI 系统打补丁
  5. 生产管理系统定制开发的项目流程
  6. 服务器黑屏只显示鼠标是什么意思,电脑黑屏只显示鼠标怎么办
  7. .NET项目报受源代码管理,向源代码管理注册此项目时出错的解决方案
  8. 长期坐着不动会得什么病?
  9. win10 UWP 你写我读
  10. 微信 - 微信小程序