MySql

164.数据库的三范式是什么?

       什么是范式:简言之就是,数据库设计对数据的存储性能,还有开发人员对数据的操作都有莫大的关系。所以建立科学的,规范的的数据库是需要满足一些

       规范的来优化数据数据存储方式。在关系型数据库中这些规范就可以称为范式。

       什么是三大范式:

             第一范式:当关系模式R的所有属性都不能在分解为更基本的数据单位时,称R是满足第一范式的,简记为1NF。满足第一范式是关系模式规范化的最低要

       求,否则,将有很多基本操作在这样的关系模式中实现不了。

             属性不可拆分

            第二范式:如果关系模式R满足第一范式,并且R得所有非主属性都完全依赖于R的每一个候选关键属性,称R满足第二范式,简记为2NF。

            每一行的数据只能与其中一列相关,即一行数据只做一件事。只要数据列中出现数据重复,就要把表拆分开来。

            第三范式:设R是一个满足第一范式条件的关系模式,X是R的任意属性集,如果X非传递依赖于R的任意一个候选关键字,称R满足第三范式,简记为3NF.

            一条数据中的每个属性都要跟主键有直接关系,不能是传递依赖关系。

            比如Student表(学号,姓名,年龄,性别,所在院校,院校地址,院校电话)

            这样一个表结构,就存在上述关系。 学号--> 所在院校 --> (院校地址,院校电话)

            这样的表结构,我们应该拆开来,如下。

          (学号,姓名,年龄,性别,所在院校)--(所在院校,院校地址,院校电话)

       注:关系实质上是一张二维表,其中每一行是一个元组,每一列是一个属性

165.一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 mysql 数据库,又插入了一条数据,此时 id 是几?

166.如何获取当前数据库版本?

       select version();

       mysql -V

167.说一下 ACID 是什么?

       一个事务本质上有四个特点ACID:

  1. Atomicity原子性
  2. Consistency一致性
  3. Isolation隔离性
  4. Durability耐久性

    原子性

          原子性任务是一个独立的操作单元,是一种要么全部是,要么全部不是的原子单位性的操作。

    一致性

          一个事务可以封装状态改变(除非它是一个只读的)。事务必须始终保持系统处于一致的状态,不管在任何给定的时间并发事务有多少。

          一致性有下面特点:

  •          如果一个操作触发辅助操作(级联,触发器),这些也必须成功,否则交易失败。
  •          如果系统是由多个节点组成,一致性规定所有的变化必须传播到所有节点(多主复制)。如果从站节点是异步更新,那么我们打破一致性规则,系统成为“最终一致性”。
  •          一个事务是数据状态的切换,因此,如果事务是并发多个,系统也必须如同串行事务一样操作。

         在现实中,事务系统遭遇并发请求时,这种串行化是有成本的, Amdahl法则描述如下:它是描述序列串行执行和并发之间的关系。

         “一个程序在并行计算情况下使用多个处理器所能提升的速度是由这个程序中串行执行部分的时间决定的。”

         大多数数据库管理系统选择(默认情况下)是放宽一致性,以达到更好的并发性。

      隔离性

               事务是并发控制机制,他们交错使用时也能提供一致性。隔离让我们隐藏来自外部世界未提交的状态变化,一个失败的事务不应该破坏系统的状态。隔离是通过用悲观或乐观锁机制实现的。

      持久性

                一个成功的事务将永久性地改变系统的状态,所以在它结束之前,所有导致状态的变化都记录在一个持久的事务日志中。如果我们的系统突然受到系统崩溃或断电,那么所有未完成已提交的事务可能会重演。

168.char 和 varchar 的区别是什么?

            首先明确的是,char的长度是不可变的,而varchar的长度是可变的,也就是说,定义一个char[10]和varchar[10],如果存进去的是‘csdn’,那么char所占的长度依然为10,除了字符‘csdn’外,后面跟六个空格,而varchar就立马把长度变为4了,取数据的时候,char类型的要用trim()去掉多余的空格,而varchar是不需要的。

           尽管如此,char的存取数度还是要比varchar要快得多,因为其长度固定,方便程序的存储与查找;但是char也为此付出的是空间的代价,因为其长度固定,所以难免会有多余的空格占位符占据空间,可谓是以空间换取时间效率,而varchar是以空间效率为首位的。

           再者,char的存储方式是,对英文字符(ASCII)占用1个字节,对一个汉字占用两个字节;而varchar的存储方式是,对每个英文字符占用2个字节,汉字也占用2个字节。

           两者的存储数据都非unicode的字符数据。

169.float 和 double 的区别是什么?

        float数值类型用于表示单精度浮点数值,而double数值类型用于表示双精度浮点数值,float和double都是浮点型,而decimal是定点型;

        https://www.cnblogs.com/gulibao/p/5416245.html

170.mysql 的内连接、左连接、右连接有什么区别?

       https://blog.csdn.net/plg17/article/details/78758593

171.mysql 索引是怎么实现的?

      https://www.cnblogs.com/chenshishuo/p/5030029.html

172.怎么验证 mysql 的索引是否满足需求?

173.说一下数据库的事务隔离?

       数据库事务的隔离级别有4个,由低到高依次为Read uncommitted 、Read committed 、Repeatable read 、Serializable ,这四个级别可以逐个解决脏读 、不可重复读 、幻读 这几类问题。

                  √: 可能出现    ×: 不会出现

  脏读 不可重复读 幻读
Read uncommitted
Read committed ×
Repeatable read × ×
Serializable × × ×

          第1级别:Read Uncommitted(读取未提交内容)
          (1)所有事务都可以看到其他未提交事务的执行结果
          (2)本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少
          (3)该级别引发的问题是——脏读(Dirty Read):读取到了未提交的数据

         第2级别:Read Committed(读取提交内容)

         (1)这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)
         (2)它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变
         (3)这种隔离级别出现的问题是——不可重复读(Nonrepeatable Read):不可重复读意味着我们在同一个事务中执行完全相同的select语句时可能看到不一样的结果。
             |——>导致这种情况的原因可能有:(1)有一个交叉的事务有新的commit,导致了数据的改变;(2)一个数据库被多个实例操作时,同一事务的其他实例在该实例处理其间可能会有新的commit

        第3级别:Repeatable Read(可重读)
       (1)这是MySQL的默认事务隔离级别
       (2)它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行
       (3)此级别可能出现的问题——幻读(Phantom Read):当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行
       (4)InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题

       第4级别:Serializable(可串行化)
       (1)这是最高的隔离级别
       (2)它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。
       (3)在这个级别,可能导致大量的超时现象和锁竞争

互联网项目中mysql应该选什么事务隔离级别

https://www.cnblogs.com/rjzheng/p/10510174.html

 

174.说一下 mysql 常用的引擎?

在MySQL数据库中,常用的引擎主要就是2个:Innodb和MyIASM。

首先:

1.简单介绍这两种引擎,以及该如何去选择。
2.这两种引擎所使用的数据结构是什么。

1.

a.Innodb引擎,Innodb引擎提供了对数据库ACID事务的支持。并且还提供了行级锁和外键的约束。它的设计的目标就是处理大数据容量的数据库系统。它本身实际上是基于Mysql后台的完整的系统。Mysql运行的时候,Innodb会在内存中建立缓冲池,用于缓冲数据和索引。但是,该引擎是不支持全文搜索的。同时,启动也比较的慢,它是不会保存表的行数的。当进行Select count(*) from table指令的时候,需要进行扫描全表。所以当需要使用数据库的事务时,该引擎就是首选。由于锁的粒度小,写操作是不会锁定全表的。所以在并发度较高的场景下使用会提升效率的。

b.MyIASM引擎,它是MySql的默认引擎,但不提供事务的支持,也不支持行级锁和外键。因此当执行Insert插入和Update更新语句时,即执行写操作的时候需要锁定这个表。所以会导致效率会降低。不过和Innodb不同的是,MyIASM引擎是保存了表的行数,于是当进行Select count(*) from table语句时,可以直接的读取已经保存的值而不需要进行扫描全表。所以,如果表的读操作远远多于写操作时,并且不需要事务的支持的。可以将MyIASM作为数据库引擎的首先。

补充2点:

c.大容量的数据集时趋向于选择Innodb。因为它支持事务处理和故障的恢复。Innodb可以利用数据日志来进行数据的恢复。主键的查询在Innodb也是比较快的。

d.大批量的插入语句时(这里是INSERT语句)在MyIASM引擎中执行的比较的快,但是UPDATE语句在Innodb下执行的会比较的快,尤其是在并发量大的时候。

2.两种引擎所使用的索引的数据结构是什么?

答案:都是B+树!

MyIASM引擎,B+树的数据结构中存储的内容实际上是实际数据的地址值。也就是说它的索引和实际数据是分开的,只不过使用索引指向了实际数据。这种索引的模式被称为非聚集索引。

Innodb引擎的索引的数据结构也是B+树,只不过数据结构中存储的都是实际的数据,这种索引有被称为聚集索引。

参考:http://blog.csdn.net/lulei1217/article/details/50954232

175.说一下 mysql 的行锁和表锁?

  • 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
  • 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
  • 页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般
  • https://www.cnblogs.com/lsxuejava/p/7305920.html

176.说一下乐观锁和悲观锁?

乐观锁

乐观锁不是数据库自带的,需要我们自己去实现。乐观锁是指操作数据库时(更新操作),想法很乐观,认为这次的操作不会导致冲突,在操作数据时,并不进行任何其他的特殊处理(也就是不加锁),而在进行更新后,再去判断是否有冲突了。

通常实现是这样的:在表中的数据进行操作时(更新),先给数据表加一个版本(version)字段,每操作一次,将那条记录的版本号加1。也就是先查询出那条记录,获取出version字段,如果要对那条记录进行操作(更新),则先判断此刻version的值是否与刚刚查询出来时的version的值相等,如果相等,则说明这段期间,没有其他程序对其进行操作,则可以执行更新,将version字段的值加1;如果更新时发现此刻的version值与刚刚获取出来的version的值不相等,则说明这段期间已经有其他程序对其进行操作了,则不进行更新操作。

悲观锁

与乐观锁相对应的就是悲观锁了。悲观锁就是在操作数据时,认为此操作会出现数据冲突,所以在进行每次操作时都要通过获取锁才能进行对相同数据的操作,这点跟java中的synchronized很相似,所以悲观锁需要耗费较多的时间。另外与乐观锁相对应的,悲观锁是由数据库自己实现了的,要用的时候,我们直接调用数据库的相关语句就可以了。

说到这里,由悲观锁涉及到的另外两个锁概念就出来了,它们就是共享锁与排它锁。共享锁和排它锁是悲观锁的不同的实现,它俩都属于悲观锁的范畴。

177.mysql 问题排查都有哪些手段?

178.如何做 mysql 的性能优化?

        https://www.cnblogs.com/zhouyusheng/p/8038224.html

原文地址:https://www.cnblogs.com/zousong/p/10513372.html