测试面试的时候,经常会问到的mysql视图到底是mysql为什么不用视图

如果你对数据库不熟悉想学习嘚话,学习专栏有一篇

那么常见的数据库面试题有哪些呢(非DBA向)

(一)mysql为什么不用视图是存储过程?有哪些优缺点

存储过程是一些預编译的SQL语句。

更加直白的理解:存储过程可以说是一个记录集它是由一些T-SQL语句组成的代码块,这些T-SQL语句代码像一个方法一样实现一些功能(对单表或多表的增删改查)然后再给这个代码块取一个名字,在用到这个功能的时候调用他就行了

  • 存储过程是一个预编译的代碼块,执行效率比较高
  • 一个存储过程替代大量T_SQL语句 可以降低网络通信量,提高通信速率
  • 可以一定程度上确保数据安全

如果你对存储过程鈈熟悉建议阅读:

(二)索引是mysql为什么不用视图?有mysql为什么不用视图作用以及优缺点

索引是对数据库表中一或多个列的值进行排序的結构,是帮助MySQL高效获取数据的数据结构

你也可以这样理解:索引就是加快检索表中数据的方法数据库的索引类似于书籍的索引。在书籍Φ索引允许用户不必翻阅完整个书就能迅速地找到所需要的信息。在数据库中索引也允许数据库程序迅速地找到表中的数据,而不必掃描整个数据库

MySQL数据库几个基本的索引类型:普通索引、唯一索引、主键索引、全文索引

  • 索引加快数据库的检索速度
  • 索引降低了插入、刪除、修改等维护任务的速度
  • 唯一索引可以确保每一行数据的唯一性
  • 通过使用索引,可以在查询的过程中使用优化隐藏器提高系统的性能
  • 索引需要占物理和数据空间 

如果你对索引还不太熟悉,建议阅读:

事务(Transaction)是并发控制的基本单位所谓的事务,它是一个操作序列這些操作要么都执行,要么都不执行它是一个不可分割的工作单位。事务是数据库维护数据一致性的单位在每个事务结束时,都能保歭数据一致性

如果你对索引还不太熟悉,建议阅读:

(四)数据库的乐观锁和悲观锁是mysql为什么不用视图

数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性。

乐观并发控制(乐观锁)和悲觀并发控制(悲观锁)是并发控制主要采用的技术手段

  • 悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作
  • 乐观锁:假設不会发生并发冲突只在提交操作时检查是否违反数据完整性。

如果你对两种锁还不太熟悉建议阅读:

(五) 使用索引查询一定能提高查询的性能吗?为mysql为什么不用视图

通常,通过索引查询数据比全表扫描要快.但是我们也必须注意到它的代价.

索引需要空间来存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时,索引本身也会被修改. 这意味着每条记录的INSERT,DELETE,UPDATE将为此多付出4,5 次的磁盘I/O. 因为索引需要额外的存储涳间和处理,那些不必要的索引反而会使查询反应时间变慢.使用索引查询不一定能提高查询性能,索引范围查询(INDEX RANGE SCAN)适用于两种情况:

  • 基于一个范围嘚检索,一般查询返回结果集小于表中记录数的30%
  • 基于非唯一性索引的检索
  • delete和truncate只删除表的数据不删除表的结构
  • 不再需要一张表的时候用drop
  • 想删除部分数据行时候,用delete并且带上where子句
  • 保留表而删除所有数据的时候用truncate

(八) 超键、候选键、主键、外键分别是mysql为什么不用视图?

    超键:茬关系中能唯一标识元组的属性集称为关系模式的超键一个属性可以为作为一个超键,多个属性组合在一起也可以作    为一个超键超键包含候选键和主键。

    主键:数据库表中对储存数据对象予以唯一和完整标识的数据列或属性的组合一个数据列只能有一个主键,且主键嘚取值不    能缺失即不能为空值(Null)。

    外键:在一个表中存在的另一个表的主键称此表的外键

(九)mysql为什么不用视图是视图?以及视图嘚使用场景有哪些

    视图是一种虚拟的表,具有和物理表相同的功能可以对视图进行增,改查,操作试图通常是有一个表或者多个表的行或    列的子集。对视图的修改不影响基本表它使得我们获取数据更容易,相比多表查询

  • 只暴露部分字段给访问者,所以就建一个虛表就是视图。
  • 查询的数据来源于不同的表而查询者希望以统一的方式查询,这样也可以建立一个视图把多个表查询结果联合起来,查询者只需要直接从视图中获取数据不必考虑数据来源于不同表所带来的差异

(十)说一说三个范式。

     第二范式(2NF):数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖(部分函数依赖指的是存在组合关键字中的某些字段决定    非关键字段的情况)也即所有非关键字段都完全依赖于任意一组候选关键字。

    第三范式(3NF):在第二范式的基础上数据表中如果不存在非关键字段对任一候选关鍵字段的传递函数依赖则符合第三范    式。所谓传递函数依赖指的是如 果存在"A → B → C"的决定关系,则C传递函数依赖于A因此,满足第三范式嘚数据库表    应该不存在如下依赖关系: 关键字段 → 非关键字段 x → 非关键字段y

答:触发器是一中特殊的存储过程主要是通过事件来触发而被执行的。它可以强化约束来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可嘚更新和变化可以联级运算。如某表上的触发器上包含对另一个表的数据操作,而该操作又会导致该表触发器被触发
2。mysql为什么不用視图是存储过程用mysql为什么不用视图来调用?
答:存储过程是一个预编译的SQL 语句优点是允许模块化的设计,就是说只需创建一次以后茬该程序中就可以调用多次。如果某次操作需要执行多次SQL 使用存储过程比单纯SQL 语句执行要快。可以用一个命令对象来调用存储过程
3。索引的作用和它的优点缺点是mysql为什么不用视图?
答:索引就一种特殊的查询表数据库的搜索引擎可以利用它加速对数据的检索。它很類似与现实生活中书的目录不需要查询整本书内容就可以找到想要的数据。索引可以是唯一的创建索引允许指定单个列或者是多个列。缺点是它减慢了数据录入的速度同时也增加了数据库的尺寸大小。
答:一般我们所说的内存泄漏指的是堆内存的泄漏堆内存是程序從堆中为其分配的,大小任意的使用完后要显示释放内存。当应用程序用关键字new 等创建对象时就从堆中为它分配一块内存,使用完后程序调用free 或者delete 释放该内存否则就说该内存就不能被使用,我们就说该内存被泄漏了
4。维护数据库的完整性和一致性你喜欢用触发器還是自写业务逻辑?为mysql为什么不用视图
答:我是这样做的,尽可能使用约束如check, 主键,外键非空字段等来约束,这样做效率最高也朂方便。其次是使用触发器这种方法可以保证,无论mysql为什么不用视图业务系统访问数据库都可以保证数据的完整新和一致性最后考虑嘚是自写业务逻辑,但这样做麻烦编程复杂,效率低下
5。mysql为什么不用视图是事务mysql为什么不用视图是锁?
答:事务就是被绑定在一起莋为一个逻辑工作单元的SQL 语句分组如果任何一个语句操作失败那么整个操作就被失败,以后操作就会回滚到操作前状态或者是上有个節点。为了确保要么执行要么不执行,就可以使用事务要将有组语句作为事务考虑,就需要通过ACID 测试即原子性,一致性隔离性和歭久性。
锁:在所以的 DBMS中锁是实现事务的关键,锁可以保证事务的完整性和并发性与现实生活中锁一样,它可以使某些数据的拥有者在某段时间内不能使用某些数据或数据结构。当然锁还分级别的
6。mysql为什么不用视图叫视图游标是mysql为什么不用视图?
答:视图是一种虛拟的表具有和物理表相同的功能。可以对视图进行增改,查操作,试图通常是有一个表或者多个表的行或列的子集对视图的修妀不影响基本表。它使得我们获取数据更容易相比多表查询。
游标:是对查询出来的结果集作为一个单元来有效的处理游标可以定在該单元中的特定行,从结果集的当前行检索一行或多行可以对结果集当前行做修改。一般不使用游标但是需要逐条处理数据的时候,遊标显得十分重要
7。为管理业务培训信息建立3个表:
(1)使用标准SQL嵌套语句查询选修课程名称为’税收基础’的学员学号和姓名?
(2) 使用標准SQL嵌套语句查询选修课程编号为’C2’的学员姓名和所属单位?
(3) 使用标准SQL嵌套语句查询不选修课程编号为’C5’的学员姓名和所属单位?
(4)查询选修了课程的学员人数
(5) 查询选修课程超过5门的学员学号和所属单位?

若给定的 key 已经存在则setnx不做任何動作,返回0

当setnx返回1时,表示获取锁做完操作以后del key,表示释放锁如果setnx返回0表示获取锁失败,整体思路大概就是这样

如知乎每个问题的被浏览器次数


  

分布式全局唯一id的实现方式有很多这里只介绍用redis实现

每次获取userId的时候,对userId加1再获取可以改进为如下形式

直接获取一段userId的朂大值,缓存到本地慢慢累加快到了userId的最大值时,再去获取一段一个用户服务宕机了,也顶多一小段userId没有用到


  

redis的散列可以让用户将多個键值对存储到一个Redis的键里面散列非常适用于将一些相关的数据存储在一起。类似map的一种结构将结构化的数据,比如一个对象(前提昰这个对象没嵌套其他的对象)给缓存到redis中以后每次读写内存时,就可以操作hash里的某个字段

在list里面一边进一边出即可

//key这个list有元素时,矗接弹出没有元素被阻塞,直到等待超时或发现可弹出元素为止上面例子超时时间为10s

加入说小编li关注了2个微博a和b,a发了一条微博(编號为100)就执行如下命令


  

b发了一条微博(编号为200)就执行如下命令:


  

假如想拿最近的10条消息就可以执行如下命令(最新的消息一定在list的最左邊):


  

无序集合自动去重,将数据放到set中就可去重可以基于JVM的HashSet去重,如果系统部署在多台机器上就可以用redis进行全局去重

可以基于set做茭集,并集差集的操作。如把2个人的粉丝列表弄一个交集就能看到两个人的共同好友是谁

实现点赞,签到like等功能


  

实现关注模型,可能认识的人

// 我关注的人也关注他,下面例子中我是seven
// 我可能认识的人,下面例子中我是seven

每个商品入库的时候即会建立他的静态标签列表如品牌,尺寸处理器,内存

// 获取品牌为联想屏幕尺寸为15.6,并且处理器为i7的电脑品牌(sinter为获取集合的交集)

排序的set可以去重还可以排序,写进去嘚时候给一个分数自动根据根据分数排序,分数可以自定义排序规则

redis的zset天生是用来做排行榜的、好友列表, 去重, 历史记录等业务需求

// 取分數最高的3个用户

我要回帖

更多关于 mysql为什么不用视图 的文章

 

随机推荐