目录
前言
什么是SQL?
什么是MySQL?
数据库三大范式是什么
mysql有关权限的表都有哪几个
MySQL的binlog有有几种录入格式?分别有什么区别?
数据类型mysql有哪些数据类型
引擎MySQL存储引擎MyISAM与InnoDB区别
MyISAM与InnoDB区别
MySQL的复制原理以及流程
读写分离有哪些解决方案?
最后
【金三银四】Java中间件面试题(2021最新版)
MySQL调优+索引+数据结构面试题(2021最新版)
【金三银四】Java微服务面试题(2021最新版)
【金三银四】Java并发编程面试题(2021最新版)
【金三银四】Java基础知识面试题(2021最新版)
【金三银四】Redis面试题(2021最新版)
【金三银四】Spring Boot面试题(2021最新版)
【金三银四】Spring MVC面试题(2021最新版)
【金三银四】Spring Cloud面试题(2021最新版)
MySQL 是业务后台系统经常用到的结构化数据库。 掌握 MySQL 相关知识是研发人员必备的能力。 与此同时,在面试过程当中,MySQL 的知识点也是经常被当做面试题目,以此来考量候选人的能力。随着业务量的增加,对于 MySQL 性能优化的要求也越来越高, 而索引方面是性能优化重点考虑的方向,所以深入理解 MySQL 索引对于未来的优化起到很重要的作用,为了方便大家对MySQL技术的了解,小编这里总结了一份MySQL的技术脑图,分享给到大家。
今日分享:整理了一份MySQL面试真题手册分享给到大家。
结构化查询语言(Structured Query Language)简称SQL,是一种数据库查询语言。
作用:用于存取数据、查询、更新和管理关系数据库系统。
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。在Java企业级开发中非常常用,因为 MySQL 是开源免费的,并且方便扩展。
第一范式:每个列都不可以再拆分。
第二范式:在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部分。
第三范式:在第二范式的基础上,非主键列只依赖于主键,不依赖于其他非主键。
在设计数据库结构的时候,要尽量遵守三范式,如果不遵守,必须有足够的理由。比如性能。事实上我们经常会为了性能而妥协数据库的设计。
MySQL服务器通过权限表来控制用户对数据库的访问,权限表存放在mysql数据库里,由mysql_install_db脚本初始化。这些权限表分别user,db,table_priv,columns_priv和host。下面分别介绍一下这些表的结构和内容:
有三种格式,statement,row和mixed。
此外,新版的MySQL中对row级别也做了一些优化,当表结构发生变化的时候,会记录语句而不是逐行记录。
1、整数类型,包括TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,分别表示1字节、2字节、3字节、4字节、8字节整数。任何整数类型都可以加上UNSIGNED属性,表示数据是无符号的,即非负整数。
长度:整数类型可以被指定长度,例如:INT(11)表示长度为11的INT类型。长度在大多数场景是没有意义的,它不会限制值的合法范围,只会影响显示字符的个数,而且需要和UNSIGNED ZEROFILL属性配合使用才有意义。
例子,假定类型设定为INT(5),属性为UNSIGNED ZEROFILL,如果用户插入的数据为12的话,那么数据库实际存储数据为00012。
2、实数类型,包括FLOAT、DOUBLE、DECIMAL。
DECIMAL可以用于存储比BIGINT还大的整型,能存储精确的小数。
而FLOAT和DOUBLE是有取值范围的,并支持使用标准的浮点进行近似计算。
计算时FLOAT和DOUBLE相比DECIMAL效率更高一些,DECIMAL你可以理解成是用字符串进行处理。
3、字符串类型,包括VARCHAR、CHAR、TEXT、BLOB
VARCHAR用于存储可变长字符串,它比定长类型更节省空间。
VARCHAR使用额外1或2个字节存储字符串长度。列长度小于255字节时,使用1字节表示,否则使用2字节表示。
VARCHAR存储的内容超出设置的长度时,内容会被截断。
CHAR是定长的,根据定义的字符串长度分配足够的空间。
CHAR会根据需要使用空格进行填充方便比较。
CHAR适合存储很短的字符串,或者所有值都接近同一个长度。
CHAR存储的内容超出设置的长度时,内容同样会被截断。
使用策略:
对于经常变更的数据来说,CHAR比VARCHAR更好,因为CHAR不容易产生碎片。
对于非常短的列,CHAR比VARCHAR在存储空间上更有效率。
使用时要注意只分配需要的空间,更长的列排序时会消耗更多内存。
尽量避免使用TEXT/BLOB类型,查询时会使用临时表,导致严重的性能开销。
4、枚举类型(ENUM),把不重复的数据存储为一个预定义的集合。
有时可以使用ENUM代替常用的字符串类型。
ENUM存储非常紧凑,会把列表值压缩到一个或两个字节。
ENUM在内部存储时,其实存的是整数。
尽量避免使用数字作为ENUM枚举的常量,因为容易混乱。
排序是按照内部存储的整数
5、日期和时间类型,尽量使用timestamp,空间效率高于datetime,
用整数保存时间戳通常不方便处理。
如果需要存储微妙,可以使用bigint存储。
看到这里,这道真题是不是就比较容易回答了。
存储引擎Storage engine:MySQL中的数据、索引以及其他对象是如何存储的,是一套文件系统的实现。
常用的存储引擎有以下:
为什么要使用数据库
MySQL 中有哪几种锁?
数据保存在文件的优缺点?
MySQL 中有哪些不同的表格?
什么是SQL?
简述在MySQL 数据库中 MyISAM 和InnoDB 的区别
数据库三大范式是什么
MySQL 中InnoDB 支持的四种事务隔离级别名称,以及逐
MySQL的binlog有有几种录入格式?分别有什么区别?
CHAR 和VARCHAR 的区别?
列对比运算符是什么?
什么是索引?
主键和候选键有什么区别?
myisamchk 是用来做什么的?
InnoDB引擎的4大特性
你怎么看到为表格定义的所有索引?
如果一个表有一列定义为TIMESTAMP,将发生什么?
MySQL_fetch_array 和MySQL_fetch_object 的区别是什么?
索引有哪些优缺点?
BLOB 和TEXT 有什么区别?
可以使用多少列创建索引?
索引使用场景(重点)
MyISAM 表格将在哪里存储,并且还提供其存储格式?
MySQL 如何优化DISTINCT?
如何显示前 50 行?
MySQL 里记录货币用什么字段类型好
索引有哪几种类型?
什么是非标准字符串类型?
索引的数据结构(b树,hash)
MySQL 支持事务吗?
NOW()和 CURRENT_DATE()有什么区别?
MySQL 有关权限的表都有哪几个?
列的字符串类型可以是什么?
什么是通用 SQL 函数?
MySQL 数据库作发布系统的存储,一天五万条以上的增量, 预计运维三年,怎么优化?
锁的优化策略
索引的底层实现原理和优化
存储时期
什么情况下设置了索引但无法使用
实践中如何优化 MySQL
完整性约束包括哪些?
优化数据库的方法
简单描述 MySQL 中,索引,主键,唯一索引,联合索引
数据库中的事务是什么?
Myql 中的事务回滚机制概述
SQL 注入漏洞产生的原因?如何防止?
为表中得字段选择合适得数据类型
索引算法有哪些?
SQL 语言包括哪几部分?每部分都有哪些操作关键字?
对于关系型数据库而言,索引是相当重要的概念,请回答:
解释 MySQL 外连接、内连接与自连接的区别:
主从复制:将主数据库中的DDL和DML操作通过二进制日志(BINLOG)传输到从数据库上,然后将这些日志重新执行(重做);从而使得从数据库的数据与主数据库保持一致。
主从复制的作用
MySQL主从复制解决的问题
MySQL主从复制工作原理
基本原理流程,3个线程以及之间的关联
复制过程
Binary log:主数据库的二进制日志
Relay log:从服务器的中继日志
第一步:master在每个事务更新数据完成之前,将该操作记录串行地写入到binlog文件中。
第二步:salve开启一个I/O Thread,该线程在master打开一个普通连接,主要工作是binlog dump process。如果读取的进度已经跟上了master,就进入睡眠状态并等待master产生新的事件。I/O线程最终的目的是将这些事件写入到中继日志中。
第三步:SQL Thread会读取中继日志,并顺序执行该日志中的SQL事件,从而与主数据库中的数据保持一致。
读写分离是依赖于主从复制,而主从复制又是为读写分离服务的。因为主从复制要求slave不能写只能读(如果对slave执行写操作,那么show slave status将会呈现Slave_SQL_Running=NO,此时你需要按照前面提到的手动同步一下slave)。
方案一
使用mysql-proxy代理
优点:直接实现读写分离和负载均衡,不用修改代码,master和slave用一样的帐号,mysql官方不建议实际生产中使用
缺点:降低性能, 不支持事务
方案二
使用AbstractRoutingDataSource+aop+annotation在dao层决定数据源。
如果采用了mybatis, 可以将读写分离放在ORM层,比如mybatis可以通过mybatis plugin拦截sql语句,所有的insert/update/delete都访问master库,所有的select 都访问salve库,这样对于dao层都是透明。 plugin实现时可以通过注解或者分析语句是读写方法来选定主从库。不过这样依然有一个问题, 也就是不支持事务, 所以我们还需要重写一下DataSourceTransactionManager, 将read-only的事务扔进读库, 其余的有读有写的扔进写库。
方案三
使用AbstractRoutingDataSource+aop+annotation在service层决定数据源,可以支持事务.
缺点:类内部方法通过this.xx()方式相互调用时,aop不会进行拦截,需进行特殊处理。
完整面试题文档获取方式:【MySQL面试真题手册】
篇幅有限,其他内容就不在这里一一展示了,整理不易,欢迎大家一起交流,喜欢小编分享的文章记得关注我点赞哟,感谢支持!重要的事情说三遍,转发+转发+转发,一定要记得转发哦!!!