太强了,从未见过如此详细的MySQL技术讲解(优化+架构)

826 阅读6分钟

前言

每一个程序员都拥有一座大厂梦,我也不例外,去年面试阿里,竟然被MySQL问倒了,很多相关性的问题都没有答上来,才2面就凉凉了。为面试做了很多准备,收集很多关于MySQL面试题,大家可以好好的了解一下!

一、MySQL有哪些特性?

  • 使用C和C++编写,并使用了多种编译器进行测试,保证源代码的可移植性
  • 支持AIX、FreeBSD、HP-UX、Linux、MacOS、Novell Netware、OpenBSD、OS/2 Wrap、Solaris、Windows等多种操作系统
  • 为多种编程语言提供了API。这些编程语言包括C、C++、Python、Java、Perl、PHP、Eiffel、Ruby和Tcl等。
  • 支持多线程,充分利用CPU资源
  • 化的SQL查询算法,有效地提高查询速度
  • 既能够作为一个单独的应用程序应用在客户端服务器网络环境中,也能够作为一个库而嵌入到其他的软件中提供多语言支持,常见的编码如中文的GB 2312、BIG5,日文的Shift_JIS等都可以用作数据表名和数据列名
  • 提供TCP/IP、ODBC和JDBC等多种数据库连接途径
  • 提供用于管理、检查、优化数据库操作的管理工具
  • 可以处理拥有上千万条记录的大型数据库

二、走进MySQL的世界

1、MySQL 性能优化的 21 个最佳实践

  • 为查询缓存优化你的查询

  • EXPLAIN 你的 SELECT 查询

  • 当只要一行数据时使用 LIMIT 1

  • 为搜索字段建索引

  • 在 Join 表的时候使用相当类型的例,并将其索引

  • 千万不要 ORDER BY RAND()

  • 避免 SELECT *

  • 永远为每张表设置一个 ID

  • 使用 ENUM 而不是 VARCHAR

  • 从 PROCEDURE ANALYSE() 取得建议

  • 尽可能的使用 NOT NULL

  • Prepared Statements

  • 无缓冲的查询

  • 把 IP 地址存成 UNSIGNED INT

  • 固定长度的表会更快

  • 垂直分割

  • 拆分大的 DELETE 或 INSERT 语句

  • 越小的列会越快

  • 选择正确的存储引擎

  • 选择正确的存储引擎

  • 小心“永久链接”

三、MySQL面试题总结

之前的阿里面试题都有做总结,具体面试题内容整理成了文档,本文是针对MySQL系列的,所以下面只展示了自己第一次面试阿里时被吊打问到的一些MySQL难题,下面是今年面试阿里遇到MySQL的题目,需要答案解析的朋友可以关注公众号:麒麟改bug。

  • 请解释关系型数据库概念及主要特点?
  • 请说出关系型数据库的典型产品、特点及应用场景?
  • 请详细描述 SQL 语句分类及对应代表性关键字。
  • 什么是 MySQL 多实例,如何配置 MySQL 多实例?
  • 如何加强 MySQL 安全,请给出可行的具体措施?
  • 误操作执行了一个 drop 库 SQL 语句,如何完整恢复?
  • 详述 MySQL 主从复制原理及配置主从的完整步骤。
  • MySQL 如何实现双向互为主从复制,并说明应用场景?
  • MySQL 如何实现级联同步,并说明应用场景?
  • MySQL 主从复制故障如何解决?

四、MySQL55道面试专题你能答出多少?

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

  • Mysql 的技术特点是什么?

  • Heap表是什么?

  • Mysql 服务器默认端口是什么?

  • 与 Oracle 相比,Mysql 有什么优势?

  • 如何区分 FLOAT 和 DOUBLE?

  • 区分 CHAR_LENGTH 和 LENGTH?

  • 请简洁描述 Mysql 中 InnoDB 支持的四种事务隔离级别名称,以及逐级之间的区别?

  • 在 Mysql 中 ENUM 的用法是什么?

  • 如何定义 REGEXP?

  • CHAR 和 VARCHAR 的区别?

  • 列的字符串类型可以是什么?

  • 如何获取当前的 Mysql 版本?

  • Mysql 中使用什么存储引擎?

  • Mysql 驱动程序是什么?

  • TIMESTAMP 在 UPDATE CURRENT_TIMESTAMP 数据类型上做什么?

  • 主键和候选键有什么区别?

  • 如何使用 Unix shell 登录 Mysql?

  • myisamchk 是用来做什么的?

  • MYSQL 数据库服务器性能分析的方法命令有哪些?

  • 如何控制 HEAP 表的最大尺寸?

  • MyISAM Static 和 MyISAM Dynamic 有什么区别?

  • federated 表是什么?

  • 如果一个表有一列定义为 TIMESTAMP,将发生什么?

  • 列设置为 AUTO INCREMENT 时,如果在表中达到最大值,会发生什么情况?

  • 怎样才能找出最后一次插入时分配了哪个自动增量?

  • 你怎么看到为表格定义的所有索引?

  • LIKE 声明中的%和_是什么意思?

  • 如何在 Unix 和 Mysql 时间戳之间进行转换?

  • 列对比运算符是什么?

  • 我们如何得到受查询影响的行数?

  • Mysql 查询是否区分大小写?

  • LIKE 和 REGEXP 操作有什么区别?

  • BLOB 和 TEXT 有什么区别?

  • mysql_fetch_array 和 mysql_fetch_object 的区别是什么?

  • 我们如何在 mysql 中运行批处理模式?

  • MyISAM 表格将在哪里存储,并且还提供其存储格式?

  • Mysql 中有哪些不同的表格?

  • ISAM 是什么?

  • InnoDB 是什么?

  • Mysql 如何优化 DISTINCT?

  • 如何输入字符为十六进制数字?

  • 如何显示前 50 行?

  • 可以使用多少列创建索引?

  • NOW()和 CURRENT_DATE()有什么区别?

  • 什么样的对象可以使用 CREATE 语句创建?

  • Mysql 表中允许有多少个 TRIGGERS?

  • 什么是非标准字符串类型?

  • 什么是通用 SQL 函数?

  • 解释访问控制列表

  • MYSQL 支持事务吗?

  • mysql 里记录货币用什么字段类型好

  • MYSQL 数据表在什么情况下容易损坏?

  • mysql 有关权限的表都有哪几个?

  • Mysql 中有哪几种锁?

五、MySQL中数据类型介绍

六、MySQL管理员常用的一些命令

七、存储过程&自定义函数详解

八、什么是索引?

九、MySQL索引原理详解

十、聊聊如何使用MySQL实现分布式锁

Mysql系列的⽬标是:通过这个系列从⼊门到全⾯掌握⼀个⾼级开发所需要的全部技能。

 分布式锁的功能

1.分布式锁使⽤者位于不同的机器中,锁获取成功之后,才可以对共享资源进⾏操作。

2. 锁具有重⼊的功能:即⼀个使⽤者可以多次获取某个锁。

3. 获取锁有超时的功能:即在指定的时间内去尝试获取锁,超过了超时时间,如果还未获取成功,则返回获取失败。

4. 能够⾃动容错,⽐如:A机器获取锁lock1之后,在释放锁lock1之前,A机器挂了,导致锁lock1未释放,结果会lock1⼀直被A机器占有着,遇到这种情况时,分布式锁要能够⾃动解决,小编这里还对应整理了一份MySQL优化500页的学习笔记,分享给到大家。可以这么做:持有锁的时候可以加个持有超时时间,超过了这个时间还未释放的,其他机器将有机会获取锁。

最后

篇幅有限,其他内容就不在这里一一展示了,欢迎大家一起交流,喜欢文章记得关注我点赞哟,感谢支持!