文章目录
前言
希望大家先试试看能自己答出多少,再看下文本文大纲(问题)
1、数据库三范式是什么?
2、常见的数据库优化方式?
3、常用的索引种类?
4、索引为什么会提升查询速度?使用索引的注意事项?
5、mysql 中 varchar 与 char 的区别以及 varchar(50)中的 50 代表的涵义?
6、MySQL 中 InnoDB 支持的四种事务隔离级别名称,以及逐级之间的区别?
7、select * 和select a,b,c…两种写法的优缺点?
8、having子句和where的异同点?
9、向表中添加一条记录,如果存在则update,不存在则insert,怎么写?
10、mysql 中 myisam 与 innodb 的区别?
本文内容(问题解答)
提示:以下是本篇文章正文内容,下面答案仅供参考,如有错误欢迎指出
1、数据库三范式是什么?
- 第一范式(1NF):字段具有原子性,不可再分。(所有关系型数据库系统都满足第一范式数据库表中的字段都是单一属性的,不可再分)
- 第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。要求数据库表中的每个实例或行必须可以被惟一地区分。通常需要为表加上一个列,以存储各个实例的惟一标识。这个惟一属性列被称为主关键字或主键。
- 满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。 所以第三范式具有如下特征:
-
- 每一列只有一个值 。
-
- 每一行都能区分。
-
- 每一个表都不包含其他表已经包含的非主关键字信息。
-
2、常见的数据库优化方式?
-
考虑在 WHERE 及 ORDER BY 涉及的列上建立索引。
-
应尽量避免在 WHERE 子句中对字段进行 NULL 值判断,创建表时 NULL 是默认值,但大多数时候应该使用 NOT
NULL,或者使用一个特殊的值,如 0,-1 作为默认值。 -
应尽量避免在 WHERE 子句中使用 != 或 <> 操作符。MySQL
只有对以下操作符才使用索引:<,<=,=,>,>=,BETWEEN,IN,以及某些时候的 LIKE。 -
应尽量避免在 WHERE 子句中使用 OR 来连接条件
-
更多sql优化策略可参考: https://blog.youkuaiyun.com/WaXiaoHui/article/details/118751396?spm=1001.2014.3001.5501
3、常用的索引种类?
- 普通索引: 即针对数据库表创建索引
- 唯一索引: 与普通索引类似,不同的就是:MySQL 数据库索引列的值必须唯一,但允许有空值
- 主键索引: 它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引
- 组合索引: 为了进一步榨取 MySQL 的效率,就要考虑建立组合索引。即将数据库表中的多个字段联合起来作为一个组合索引。
4、索引为什么会提升查询速度?使用索引的注意事项?
建立索引后,会对表中的数据进行排序,生成一个有序的集合,底层实现是B+树,一般的顺序查找,复杂度为O(n),而二分查找复杂度为O(log2n)。就好比一本书的目录,建立索引后,会根据查询条件拼配索引表中的值,精准查询。
适当的建立索引可以提升查询速度,但是索引的建立是因为有大量的查询,且业务需求并不需要频繁的进行修改和删除操作,如果没有大量的数据,建立索引反而会增加系统的运行时间,建立索引后还会降低删除和修改的效率,因为删除和修改后会造成索引的重新排序。
5、mysql 中 varchar 与 char 的区别以及 varchar(50)中的 50 代表的涵义?
varchar 与 char 的区别: char 是一种固定长度的类型,varchar 则是一种可变长度的类型.
varchar(50)中 50 的涵义 : 最多存放 50 个字节
6、MySQL 中 InnoDB 支持的四种事务隔离级别名称,以及逐级之间的区别?
- Read Uncommitted(读取未提交内容) >> 在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。
- Read Committed(读取提交内容) >> 这是大多数数据库系统的默认隔离级别(但不是 MySQL 默认的)。它满足了隔离的简单定义:一
个事务只能看见已经提交事务所做的改变。这种隔离级别也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该
实例处理其间可能会有新的 commit,所以同一 select 可能返回不同结果。 - Repeatable Read(可重读) >> 这是 MySQL 的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据
行。不过理论上,这会导致另一个棘手的问题:幻读(Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事
务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB 和 Falcon 存储引擎通过多版本并发控制
(MVCC,Multiversion Concurrency Control 间隙锁)机制解决了该问题。注:其实多版本只是解决不可重复读问题,而加上间隙锁(也
就是它这里所谓的并发控制)才解决了幻读问题。 - Serializable(可串行化) >> 这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。
7、select * 和select a,b,c…两种写法的优缺点?
- 前者要解析数据字典,后者不需要
- 结果输出顺序,前者与建表列顺序相同,后者按指定字段顺序。
- 表字段改名,前者不需要修改,后者需要改
- 后者可以建立索引进行优化,前者无法优化
- 后者的可读性比前者要高
8、having子句和where的异同点?
- 语法上:where 用表中列名,having 用 select 结果别名
- 影响结果范围:where 从表读出数据的行数,having 返回客户端的行数
- 索引:where 可以使用索引,having 不能使用索引,只能在临时结果集操作
- where 后面不能使用聚集函数,having 是专门使用聚集函数的。
9、向表中添加一条记录,如果存在则update,不存在则insert,怎么写?
INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=c+1;
10、mysql 中 myisam 与 innodb 的区别?
- 事务支持 > MyISAM:强调的是性能,每次查询具有原子性,其执行数度比 InnoDB 类型更快,但是不提供事务支持。 > InnoDB:提供事
务支持事务,外部键等高级数据库功能。 具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全
(transaction-safe (ACID compliant))型表。 - InnoDB 支持行级锁,而 MyISAM 支持表级锁. >> 用户在操作myisam 表时,select,update,delete,insert 语句都会给表自动
加锁,如果加锁以后的表满足 insert 并发的情况下,可以在表的尾部插入新的数据。 - InnoDB 支持 MVCC, 而 MyISAM 不支持
- InnoDB 支持外键,而 MyISAM 不支持
- 表主键 > MyISAM:允许没有任何索引和主键的表存在,索引都是保存行的地址。 > InnoDB:如果没有设定主键或者非空唯一索引,就会自动生成一个 6 字节的主键(用户不可见),数据是主索引的一部分,附加索引保存的是主索引的值。
- InnoDB 不支持全文索引,而 MyISAM 支持。
- 可移植性、备份及恢复 > MyISAM:数据是以文件的形式存储,所以在跨平台的数据转移中会很方便。在备份和恢复时可单独针对某个表进行操作。 > InnoDB:免费的方案可以是拷贝数据文件、备份binlog,或者用 mysqldump,在数据量达到几十 G 的时候就相对痛苦了
- 存储结构 > MyISAM:每个 MyISAM 在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm 文件存储表定义。数据文件的扩展名为.MYD (MYData)。索引文件的扩展名是.MYI (MYIndex)。 > InnoDB:所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),InnoDB 表的大小只受限于操作系统文件的大小,一般为 2GB。
# 总结 以上是我总结的一些sql方面的题目,不论面试还是自我检查都可以试试,加油