Mysql得一些基础问题

关于mysql得一些问题

1.数据库三范式是什么?
  1. 第一范式(1NF):字段具有原子性,不可再分。(所有关系型数据库系
    统都满足第一范式数据库表中的字段都是单一属性的,不可再分)
  2. 第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足
    第二范式(2NF)必须先满足第一范式(1NF)。要求数据库表中的每
    个实例或行必须可以被惟一地区分。通常需要为表加上一个列,以存储
    各个实例的惟一标识。这个惟一属性列被称为主关键字或主键。
  3. 满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三
    范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关
    键字信息。 >所以第三范式具有如下特征: >>1. 每一列只有一个
    值 >>2. 每一行都能区分。 >>3. 每一个表都不包含其他表已经包含
    的非主关键字信息。

总结 : 在实际使用中,并不会严格遵守第三范式,库表为了查询和操作方便会进行一些字段得冗余

2.请简述常用的索引有哪些种类?
  1. 普通索引: 即针对数据库表创建索引
  2. 唯一索引: 与普通索引类似,不同的就是:MySQL 数据库索引列的值
    必须唯一,但允许有空值
  3. 主键索引: 它是一种特殊的唯一索引,不允许有空值。一般是在建表的
    时候同时创建主键索引
  4. 组合索引: 为了进一步榨取 MySQL 的效率,就要考虑建立组合索引。
    即将数据库表中的多个字段联合起来作为一个组合索引。
3.mysql 的复制原理以及流程?

Mysql 内建的复制功能是构建大型,高性能应用程序的基础。将 Mysql 的数据
分布到多个系统上去,这种分布的机制,是通过将 Mysql 的某一台主机的数据
复制到其它主机(slaves)上,并重新执行一遍来实现的。 * 复制过程中一
个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将
更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志
可以记录发送到从服务器的更新。 当一个从服务器连接主服务器时,它通知主
服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生
的任何更新,然后封锁并等待主服务器通知新的更新。 过程如下 1. 主服务器
把更新记录到二进制日志文件中。 2. 从服务器把主服务器的二进制日志拷贝
到自己的中继日志(replay log)中。 3. 从服务器重做中继日志中的时间,
把更新应用到自己的数据库上。

4.mysql 支持的复制类型?
  1. 基于语句的复制: 在主服务器上执行的 SQL 语句,在从服务器上执行
    同样的语句。MySQL 默认采用基于语句的复制,效率比较高。 一旦发
    现没法精确复制时,会自动选着基于行的复制。
  2. 基于行的复制:把改变的内容复制过去,而不是把命令在从服务器上执
    行一遍. 从 mysql5.0 开始支持
  3. 混合类型的复制: 默认采用基于语句的复制,一旦发现基于语句的无法
    精确的复制时,就会采用基于行的复制。
5.mysql 中 myisam 与 innodb 的区别?
  1. 事务支持
    MyISAM:强调的是性能,每次查询具有原子性,其执行数度比 InnoDB 类型更快,但是不提供事务支持。
    InnoDB:提供事务支持事务,外部键等高级数据库功能。 具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。
  2. InnoDB 支持行级锁,而 MyISAM 支持表级锁.
    用户在操作myisam 表时,select,update,delete,insert 语句都会给表自动
    加锁,如果加锁以后的表满足 insert 并发的情况下,可以在表的尾部插
    入新的数据。
  3. InnoDB 支持 MVCC, 而 MyISAM 不支持
    MVCC(Mutil-Version Concurrency Control),就是多版本并发控制。MVCC 是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问。
  4. InnoDB 支持外键,而 MyISAM 不支持
  5. 表主键
    MyISAM:允许没有任何索引和主键的表存在,索引都是保
    存行的地址。
    InnoDB:如果没有设定主键或者非空唯一索引,就会自动生成一个 6 字节的主键(用户不可见),数据是主索引的一部分,附加索引保存的是主索引的值。
  6. InnoDB 不支持全文索引,而 MyISAM 支持。
  7. 可移植性、备份及恢复
    MyISAM:数据是以文件的形式存储,所以在跨平台的数据转移中会很方便。在备份和恢复时可单独针对某个表进行操作。
    InnoDB:免费的方案可以是拷贝数据文件、备份binlog,或者用 mysqldump,在数据量达到几十 G 的时候就相对痛苦了
  8. 存储结构
    MyISAM:每个 MyISAM 在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm 文件存储表定义。数据文件的扩展名为.MYD (MYData)。索引文件的扩展名是.MYI(MYIndex)。
    InnoDB:所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),InnoDB 表的大小只受限于操作系统文件的大小,一般为 2GB。
5.通用SQL函数?

CONCAT(A,B)-连接两个字符串值以创建单个字符串输出。通常用于将两个或多个字段合并为一个字段。
FORMAT(X,D)-格式化数字X到D有效数字。
CURRDATE(),CURRTIME()-返回当前日期或时间。
NOW()-将当前日期和时间作为一个值返回。
MONTH(),DAY(),YEAR(),WEEK(),WEEKDAY()-从日期值中提取给定数据。
HOUR(),MINUTE(),SECOND()-从时间值中提取给定数据。
DATEDIFF(A,B)-确定两个日期之间的差异,通常用于计算年龄
SUBTIMES(A,B)-确定两次之间的差异。
FROMDAYS(INT)-将整数天数转换为日期值。

6.mysql 中 varchar 与 char 的区别以及 varchar(50)中的 50 代表的涵义?
  1. varchar 与 char 的区别: char 是一种固定长度的类型,varchar 则是一种可变长度的类型.当CHAR值被存储时,它们被用空格填充到特定长度,检索CHAR值时需删除尾随空格。
  2. varchar(50)中 50 的涵义 : 最多存放 50 个字节
  3. int(20)中 20 的涵义: int(M)中的 M indicates the maximum
    display width (最大显示宽度)for integer types. The maximum
    legal display width is 255.
7.MySQL 中 InnoDB 支持的四种事务隔离级别名称,以及逐级之间的区别?
  1. Read Uncommitted(读取未提交内容) >> 在该隔离级别,所有事
    务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应
    用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称
    之为脏读(Dirty Read)。
  2. Read Committed(读取提交内容) >> 这是大多数数据库系统的默
    认隔离级别(但不是 MySQL 默认的)。它满足了隔离的简单定义:一
    个事务只能看见已经提交事务所做的改变。这种隔离级别也支持所谓的
    不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该
    实例处理其间可能会有新的 commit,所以同一 select 可能返回不同结
    果。
  3. Repeatable Read(可重读) >> 这是 MySQL 的默认事务隔离级
    别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据
    行。不过理论上,这会导致另一个棘手的问题:幻读(Phantom
    Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事
    务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现
    有新的“幻影” 行。InnoDB 和 Falcon 存储引擎通过多版本并发控制
    (MVCC,Multiversion Concurrency Control 间隙锁)机制解决了
    该问题。注:其实多版本只是解决不可重复读问题,而加上间隙锁(也
    就是它这里所谓的并发控制)才解决了幻读问题。
  4. Serializable(可串行化) >> 这是最高的隔离级别,它通过强制事务
    排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个
    读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁
    竞争。
8.一张表,里面有ID自增主键,当insert了17条记录之后,删除了第15,16,17条记录,再把Mysql重启,再insert一条记录,这条记录的ID是18还是15?

1.如果表的类型是MyISAM,那么是18因为MyISAM表会把自增主键的最大ID记录到数据文件里,重启MySQL自增主键的最大ID也不会丢失
2.如果表的类型是InnoDB,那么是15InnoDB表只是把自增主键的最大ID记录到内存中,所以重启数据库或者是对表进行OPTIMIZE操作,都会导致最大ID丢失.

9.表中有大字段 X(例如:text 类型),且字段 X 不会经常更新,以读为为主,将该字段拆成子表好处是什么?

如果字段里面有大字段(text,blob)类型的,而且这些字段的访问并不多,这
时候放在一起就变成缺点了。 MYSQL 数据库的记录存储是按行存储的,数据
块大小又是固定的(16K,数据库一次IO读取量),每条记录越小,相同的块存储的记录就越多。此
时应该把大字段拆走,这样应付大部分小字段的查询时,就能提高效率。当需
要查询大字段时,此时的关联查询是不可避免的,但也是值得的。拆分开后,
对字段的 UPDAE 就要 UPDATE 多个表了

10.MySQL 中 InnoDB 引擎的行锁是通过加在什么上完成(或称实现)的?

InnoDB 行锁是通过给索引上的索引项加锁来实现的,这一点 MySQL 与
Oracle 不同,后者是通过在数据块中对相应数据行加锁来实现的。InnoDB 这
种行锁实现特点意味着:只有通过索引条件检索数据,InnoDB 才使用行级
锁,否则,InnoDB 将使用表锁!

11.若一张表中只有一个字段 VARCHAR(N)类型,utf8 编码,则 N 最大值

为多少(精确到数量级即可)?
由于 utf8 的每个字符最多占用 3 个字节。而 MySQL 定义行的长度不能超过
65535,因此 N 的最大值计算方法为:(65535-1-2)/3。减去 1 的原因是实
际存储从第二个字节开始,减去 2 的原因是因为要在列表长度存储实际的字符
长度,除以 3 是因为 utf8 限制:每个字符最多占用 3 个字节。

drop,delete与truncate的区别

drop直接删掉表,truncate删除表中数据,再插入时自增长id又从1开始 , delete删除表中数据,可以加where字句。
(1)DELETE语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作。TRUNCATE TABLE 则一次性地从表中删除所有的数据并不把单独的删除操作记录记入日志保存,删除行是不能恢复的。并且在删除的过程中不会激活与表有关的删除触发器。执行速度快。
(2)表和索引所占空间。当表被TRUNCATE 后,这个表和索引所占用的空间会恢复到初始大小,而DELETE操作不会减少表或索引所占用的空间。drop语句将表所占用的空间全释放掉。

12.存储过程与触发器的区别

触发器与存储过程非常相似,触发器也是SQL语句集,两者唯一的区别是触发器不能用EXECUTE语句调用,而是在用户执行Transact-SQL语句时自动触发(激活)执行。触发器是在一个修改了指定表中的数据时执行的存储过程。通常通过创建触发器来强制实现不同表中的逻辑相关数据的引用完整性和一致性。由于用户不能绕过触发器,所以可以用它来强制实施复杂的业务规则,以确保数据的完整性。触发器不同于存储过程,触发器主要是通过事件执行触发而被执行的,而
存储过程可以通过存储过程名称名字而直接调用。当对某一表进行诸如UPDATE、INSERT、DELETE这些操作时,SQLSERVER就会自动执行触发器所定义的SQL语句,从而确保对数据的处理必须符合这些SQL语句所定义的规则。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值