原文出处:https://juejin.im/post/5a9ca0d6518825555c1d1acd

  作者:Java3y

  本文在原文基础上进行修改,而且没有特定针对MySQL.

一、存储过程(以及函数)

  定义理解:

  存储过程和函数是事先经过编译并存储在数据库中的一段SQL语句的集合。

  二者的区别:

  1. 函数必须有返回值,而存储过程没有;
  2. 函数的参数只能是IN类型,存储过程的参数可以使用IN、OUT、INOUT类型。

  优点:

  对代码进行封装,功能强大,调用方便;

  将数据处理放在数据库服务器上,减少业务系统与数据库的交互;

  存储过程是一个预编译的代码块,执行效率高;

  

  缺点:

  如果存储过程中有大量的复杂运算,会占用数据库服务器的CPU,造成数据库服务器的压力;

  不同数据库的存储过程语法不一致,难以通用和维护;

  业务逻辑放在数据库中,难以迭代;

  过多地使用存储过程会降低系统的可移植性。

  

  哪些应用场景适合使用存储过程?

  在商业数据库的应用领域,例如金融、企业、政府等,存储过程使用广泛,因为其业务相对稳定,而且要求数据非常准确不出错。这样的逻辑一旦调试通过,将会很长时间不需要改动。甚至一些政务项目的核心逻辑都会用存储过程编写。

  但是,也有码农反应,十年前使用DB2时,存储过程被大量使用,基于Oracle的应用,存储过程已经不被推荐使用,一是因为逻辑不方便移植,二是消耗数据库资源。

  不适合大规模应用存储过程的场景:

  1. 需求经常改变,导致数据库结构经常需要调整。若修改一个表,就需要N个相关的存储过程,这是噩梦。例如互联网行业,需求变更频繁。(一个原因是MySQL的广泛使用,而它的存储过程功能较弱。)(有很多人反对这点,因为觉得改存储过程比其改应用代码来说,要少很多痛苦。)
  2. 数据需要迁移,例如原来使用SQL Server,现在想用Oracle,也是噩梦,因为不同数据库的厂商提供的SQL函数不一样。
  3. 商业逻辑要求聚合多种格式、多个来源的数据,并且要进行数据适配,这种工作放在中间层而不是数据库里实现。
  4. 数据库集群,需要实现数据库Server端存储过程代码变更同步,十分麻烦;
  5. 很多NoSQL数据库,比如MongoDB,本身没有存储过程的概念。

  参考:知乎——存储过程在实际项目中用得多吗?

二、关于数据库设计的三个范式

  首先要明确,满足第三范式,就必定满足第二范式;满足第二范式,就必定已经满足第一范式。

  我之前的文章:数据库设计与三大范式

三、视图

  为什么需要视图?

  对于同一张表,A用户只关新部分字段,B用户只关心另一些字段,那么此时把全部的字段都显示给他们看,是不合理的。

  所以我们需要提供了一个表的“视图”,给到他们想看的数据的同时,屏蔽掉其它字段的数据。

  视图的是怎么实现的?

  视图是保存在数据库中的select查询。

  

  其它方面,我前面的文章有提到。

四、drop、delete、truncate分别在什么场景下使用

  drop table:

  • 1)属于DDL
  • 2)不可回滚
  • 3)不可带where
  • 4)表内容和结构删除
  • 5)删除速度快

  truncate table

  • 1)属于DDL
  • 2)不可回滚
  • 3)不可带where
  • 4)表内容删除
  • 5)删除速度快

  delete from

  • 1)属于DML

  • 2)可回滚

  • 3)可带where

  • 4)表结构在,表内容要看where执行的情况

  • 5)删除速度慢,需要逐行删除

  总结:

  • 不再需要一张表时,用drop;
  • 想删除部分数据行时,用带where的delete;
  • 保留表,清空表中数据时,用truncate;

五、索引

  索引的知识点前面都提过,但是还没涉及到更深的它到底是 如何工作的,比如索引表是什么?它存储在哪?等问题

  这里只列出最常见的两个问题。

  什么样的表需要创建索引?什么样的字段适合创建索引?

  什么样的表要避免使用索引?什么样的字段不适合创建索引?

六、事务

  事务的ACID属性:

  原子性(Atomicity):事务中的所有元素必须作为一个整体提交或回滚。

  一致性(Consistency):事务完成时,数据必须处于一致状态。在事务进行中,可能会不一致。如转账操作中的金额总量。

  隔离性(Isolation):对数据进行修改的所有并发事务是彼此隔离的,即事务是独立的。

  持久性(Durability):指不管系统是否发生了故障,事务处理的结果都是永久的。就是说一旦事务被提交,事务的效果会被永久地保留在数据库中。

  事务的隔离级别:

  编写事务的原则:

  • 事务尽可能简短,较大的事务占用的资源很多;
  • 事务中访问的数据量尽量少,这样事务之间对资源的争夺就少;
  • 查询数据不要使用事务;
  • 事务处理的过程中尽量不要出现等待用户输入的操作。

七、数据库的乐观锁、悲观锁(即锁问题)

MySQL 数据库面试题的更多相关文章

  1. 总结的一些MySQL数据库面试题

    1.sql语句应该考虑哪些安全性? 1.防止sql注入,对特殊字符进行转义,过滤或者使用预编译的sql语句绑定变量. 2.最小权限原则,特别是不要用root账户,为不同的类型的动作或者组建使用不同的账 ...

  2. MySQl数据库面试题

    1. MySQL中索引什么作用? 索引的定义和创建的目的 1) 索引是对数据库表中一列或者多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息 2) 索引的分类:主键索引,唯一索引,常规 ...

  3. 2020年MySQL数据库面试题总结(50道题含答案解析)

    1.MySQL 中有哪几种锁? (1)表级锁:开销小,加锁快:不会出现死锁:锁定粒度大,发生锁冲突的概率最 高,并发度最低. (2)行级锁:开销大,加锁慢:会出现死锁:锁定粒度最小,发生锁冲突的概率最 ...

  4. SQL数据库面试题

    SQL数据库面试题 1.SQL SREVER中,向一个表中插入了新数据,如何快捷的得到自增量字段的当前值 这种情况其实我们经常用到,比如我们新建了一个用户,建立完用户后我们希望马上得到这个新用户的ID ...

  5. Oracle数据库面试题

    1.取出表中第31到40行的记录 mysql方案:select * from t order by id limit 30,10 oracle方案: select t2.* from (select ...

  6. .NET面试题系列(十六)数据库面试题

    数据库事务的四大特性 原子性(Atomicity) 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚.因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响. ...

  7. SQL SERVER 数据库面试题

    1.用一条SQL语句 查询出每门课都大于80分的学生姓名 name   kecheng   fenshu 张三     语文       81张三     数学       75李四     语文   ...

  8. Oracel 数据库面试题

    1.取出表中第31到40行的记录mysql方案: , oracle方案: select t2.* ) t2 2.truncate和delete有什么区别TRUNCATE TABLE在功能上与不带WHE ...

  9. asp.net 数据库面试题(基础)

    今天到某公司笔试,数据库考的比较多,但是说老实话,考的也比较基础.现在趁回忆得起来,将数据库知识简单整理如下: 一.建表指令 比如创建一个学生表student,它由学号Sno,姓名Sname,性别Ss ...

随机推荐

  1. jinjia2-HTML 转义

    当从模板生成 HTML 时,始终有这样的风险:变量包含影响已生成 HTML 的字符.有两种 解决方法:手动转义每个字符或默认自动转义所有的东西. Jinja 两者都支持,使用哪个取决于应用的配置.默认 ...

  2. flask中用类的方式构造视图函数

    from flask import Flask from flask.views import MethodView app = Flask(__name__) class IndexView(Met ...

  3. Java并发指南6:Java内存模型JMM总结

    本文转载自互联网,侵删   在前面的文章中我们介绍了Java并发基础和线程安全的概念,以及JMM内存模型的介绍,包括其定义的各种规则.同时我们也介绍了volatile在JMM中的实现原理,以及Lock ...

  4. Leetcode题目292.Nim游戏(脑筋急转弯)

    题目描述: 你和你的朋友,两个人一起玩 Nim 游戏:桌子上有一堆石头,每次你们轮流拿掉 1 - 3 块石头. 拿掉最后一块石头的人就是获胜者.你作为先手. 你们是聪明人,每一步都是最优解. 编写一个 ...

  5. APP界面架构设计

    作为PM,信息架构和页面流的设计想必烂熟于心,当确定好产品战略层和范围层即为何种目标用户提供何种服务后,就要着手搭建功能架构,将目标功能通过良好的用户体验传递给用户,目的是高效解决用户痛点,从而实现价 ...

  6. 安装Chrome扩展程序xpath

    最近工作用到xpath,直接从浏览器复制下来路径时常会出错而且长度很长,于是我想到之前用过的一款chrome插件,可以直接编写xpath语句,并实时出现解析出的结果,检验xpath语句是否编写正确.效 ...

  7. 模糊C均值聚类-FCM算法

    FCM(fuzzy c-means) 模糊c均值聚类融合了模糊理论的精髓.相较于k-means的硬聚类,模糊c提供了更加灵活的聚类结果.因为大部分情况下,数据集中的对象不能划分成为明显分离的簇,指派一 ...

  8. 安装mysql问题解决

    [root@apollo init.d]# /etc/init.d/mysqld startmy_print_defaults: Can't read dir of '/etc/my.cnf.' (E ...

  9. 15 Flutter仿京东商城项目 搜索页面布局

    Search.dart import 'package:flutter/material.dart'; import 'package:flutter_jdshop/services/ScreenAd ...

  10. tomcat加载java程序非常慢解决

    解决: 下面两种方式都要添加上,速度会很快,启动妙级的 1)在Tomcat环境中解决 可以通过配置JRE使用非阻塞的Entropy Source. 在catalina.sh中加入这么一行: JAVA_ ...