除了基础题部分, 小编计划收集整理的 MySQL 面试题还包括如下知识点或题型:
MySQL 高性能索引
SQL 语句
MySQL 查询优化
MySQL 高扩展高可用
MySQL 安全性
为了避免收藏不看, 让大家更有耐心看下去, 印象更深刻些, 小编将分五次分别发布这些内容, 加上本文一共 6 篇, 欢迎持续关注.
首先我们先来看一道真题:
真题
请写出下面 MySQL 数据类型表达的意义(int(0),char(16),varchar(16),datetime,text)
知识点分析
此真题主要考察的是 MySQL 数据类型. MySQL 数据类型属于 MySQL 数据库基础, 由此延伸出的知识点还包括如下内容:
MySQL 基础操作
MySQL 存储引擎
MySQL 锁机制
MySQL 事务处理, 存储过程, 触发器
下面我们就来将这些知识一网打尽
数据类型考点:
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 存储.
看到这里, 这道真题是不是就比较容易回答了.
答: int(0)表示数据是 INT 类型, 长度是 0,char(16)表示固定长度字符串, 长度为 16,varchar(16)表示可变长度字符串, 长度为 16,datetime 表示时间类型, text 表示字符串类型, 能存储大字符串, 最多存储 65535 字节数据)
MySQL 基础操作:
常见操作
MySQL 的连接和关闭: mysql -u -p -h -P
-u: 指定用户名
-p: 指定密码
-h: 主机
-P: 端口
进入 MySQL 命令行后: G,c,q,s,h,d
G: 打印结果垂直显示
c: 取消当前 MySQL 命令
q: 退出 MySQL 连接
s: 显示服务器状态
h: 帮助信息
d: 改变执行符
MySQL 存储引擎:
1,InnoDB 存储引擎,
默认事务型引擎, 最重要最广泛的存储引擎, 性能非常优秀.
数据存储在共享表空间, 可以通过配置分开. 也就是多个表和索引都存储在一个表空间中, 可以通过配置文件改变此配置.
对主键查询的性能高于其他类型的存储引擎.
内部做了很多优化, 从磁盘读取数据时会自动构建 hash 索引, 插入数据时自动构建插入缓冲区.
通过一些机制和工具支持真正的热备份.
支持崩溃后的安全恢复.
支持行级锁.
支持外键.
2,MyISAM 存储引擎,
5.1 版本前, 是默认存储引擎.
拥有全文索引, 压缩, 空间函数.
不支持事务和行级锁, 不支持崩溃后的安全恢复.
表存储在两个文件, MYD 和 MYI.
设计简单, 某些场景下性能很好, 例如获取整个表有多少条数据, 性能很高.
全文索引不是很常用, 不如使用外部的 ElasticSearch 或 Lucene.
3, 其他表引擎,
Archive,Blackhole,CSV,Memory
使用策略
在大多数场景下建议使用 InnoDB 存储引擎.
MySQL 锁机制:
表锁是日常开发中的常见问题, 因此也是面试当中最常见的考察点, 当多个查询同一时刻进行数据修改时, 就会产生并发控制的问题.
共享锁和排他锁, 就是读锁和写锁.
共享锁, 不堵塞, 多个用户可以同时读一个资源, 互不干扰.
排他锁, 一个写锁会阻塞其他的读锁和写锁, 这样可以只允许一个用户进行写入, 防止其他用户读取正在写入的资源.
锁的粒度
表锁, 系统开销最小, 会锁定整张表, MyIsam 使用表锁.
行锁, 最大程度的支持并发处理, 但是也带来了最大的锁开销, InnoDB 使用行锁.
MySQL 事务处理:
MySQL 提供事务处理的表引擎, 也就是 InnoDB.
服务器层不管理事务, 由下层的引擎实现, 所以同一个事务中, 使用多种引擎是不靠谱的.
需要注意, 在非事务表上执行事务操作, MySQL 不会发出提醒, 也不会报错.
存储过程:
为以后的使用保存的一条或多条 MySQL 语句的集合, 因此也可以在存储过程中加入业务逻辑和流程.
可以在存储过程中创建表, 更新数据, 删除数据等等.
使用策略
可以通过把 SQL 语句封装在容易使用的单元中, 简化复杂的操作
可以保证数据的一致性
可以简化对变动的管理
触发器:
提供给程序员和数据分析员来保证数据完整性的一种方法, 它是与表事件相关的特殊的存储过程.
使用场景
可以通过数据库中的相关表实现级联更改.
实时监控某张表中的某个字段的更改而需要做出相应的处理.
例如可以生成某些业务的编号.
注意不要滥用, 否则会造成数据库及应用程序的维护困难.
大家需要牢记以上基础知识点, 重点是理解数据类型 CHAR 和 VARCHAR 的差异, 表存储引擎 InnoDB 和 MyISAM 的区别.
问题 1: 请说明 InnoDB 和 MyISAM 的区别
答:
InnoDB 支持事务, MyISAM 不支持;
InnoDB 数据存储在共享表空间, MyISAM 数据存储在文件中;
InnoDB 支持行级锁, MyISAM 只支持表锁;
InnoDB 支持崩溃后的恢复, MyISAM 不支持;
InnoDB 支持外键, MyISAM 不支持;
InnoDB 不支持全文索引, MyISAM 支持全文索引;
问题 2:innodb 引擎的特性
答:
插入缓冲(insert buffer)
二次写(double write)
自适应哈希索引(ahi)
预读(read ahead)
问题 3: 请列举 3 个以上表引擎
答:
InnoDB,MyISAM,Memory
问题 4: 请说明 varchar 和 text 的区别
答:
varchar 可指定字符数, text 不能指定, 内部存储 varchar 是存入的实际字符数 + 1 个字节 (n<=255) 或 2 个字节(n>255),text 是实际字符数 + 2 个字节.
text 类型不能有默认值.
varchar 可直接创建索引, text 创建索引要指定前多少个字符. varchar 查询速度快于 text, 在都创建索引的情况下, text 的索引几乎不起作用.
查询 text 需要创建临时表.
问题 5:varchar(50)中 50 的含义
答:
最多存放 50 个字符, varchar(50)和 (200) 存储 hello 所占空间一样, 但后者在排序时会消耗更多内存, 因为 order by col 采用 fixed_length 计算 col 长度(memory 引擎也一样).
问题 6:int(20)中 20 的含义
答: 是指显示字符的长度, 不影响内部存储, 只是当定义了 ZEROFILL 时, 前面补多少个 0
来源: http://database.51cto.com/art/201805/572122.htm