zoukankan      html  css  js  c++  java
  • 面试题录:数据库篇

    1、数据库三大范式

    数据库设计的三大范式

    为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就叫做范式。

    范式就是符合某一种设计要求的总结,要想设计一个结构合理的关系型数据库,必须满足一定的范式。

    三大范式:

    第一范式:当关系模式R的所有属性都不能在分解为更基本的数据单位时,称R是满足第一范式的,简记为1NF。满足第一范式是关系模式规范化的最低要求,否则,将有很多基本操作在这样的关系模式中实现不了;

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

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

    理解:

    第一范式

    1、每一列属性都是不可再分的属性值,确保每一列的原子性

    2、两列的属性相近或相似或一样,尽量合并属性一样的列,确保不产生冗余数据。

    第二范式

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

    2、一个人同时订几个房间,就会出来一个订单号多条数据,这样子联系人都是重复的,就会造成数据冗余。我们应该把他拆开来。

    第三范式

    1、数据不能存在传递关系,即每个属性都跟主键有直接关系而不是间接关系。像:a–>b–>c 属性之间含有这样的关系,是不符合第三范式的。

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

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

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

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




    2、MySql存储过程

    什么是存储过程:

    存储过程是可编程的函数,在数据库中创建并保存,可以由SQL语句和控制结构组成。当想要在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。数据库中的存储过程可以看做是对编程中面向对象方法的模拟,它允许控制数据的访问方式。存储过程是数据库的一个重要的功能,MySQL 5.0以前并不支持存储过程,这使得MySQL在应用上大打折扣。好在MySQL 5.0开始支持存储过程,这样即可以大大提高数据库的处理速度,同时也可以提高数据库编程的灵活性。




    3、MySql引擎(innoDB和MyISAM的区别)

    InnoDB:
    支持事务处理等
    不加锁读取
    支持外键
    支持行锁
    不支持FULLTEXT类型的索引
    不保存表的具体行数,扫描表来计算有多少行
    DELETE 表时,是一行一行的删除
    InnoDB 把数据和索引存放在表空间里面
    跨平台可直接拷贝使用
    InnoDB中必须包含AUTO_INCREMENT类型字段的索引
    表格很难被压缩

    MyISAM:
    不支持事务,回滚将造成不完全回滚,不具有原子性
    不支持外键
    不支持外键
    支持全文搜索
    保存表的具体行数,不带where时,直接返回保存的行数
    DELETE 表时,先drop表,然后重建表
    MyISAM 表被存放在三个文件 。frm 文件存放表格定义。 数据文件是MYD (MYData) 。 索引文件是MYI (MYIndex)引伸
    跨平台很难直接拷贝
    MyISAM中可以使AUTO_INCREMENT类型字段建立联合索引
    表格可以被压缩

    选择:
    因为MyISAM相对简单所以在效率上要优于InnoDB.如果系统读多,写少。对原子性要求低。那么MyISAM最好的选择。且MyISAM恢复速度快。可直接用备份覆盖恢复。
    如果系统读少,写多的时候,尤其是并发写入高的时候。InnoDB就是首选了。




    4、MySql数据库性能优化

    数据库性能方面的话,我个人认为最主要的就是,存储引擎的选择了。

    这个不是特别在行,给大家提供一个大神的博客链接,数据库性能优化详解:---->https://www.cnblogs.com/luxiaoxun/p/4694144.html




    5、SQL优化

    1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。

    2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描。

    3.应尽量避免在 where 子句中使用 != 或 <> 操作符,否则将引擎放弃使用索引而进行全表扫描。

    4.应尽量避免在 where 子句中使用 or 来连接条件,如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描。

    5.in 和 not in 也要慎用,否则会导致全表扫描

    6.使用like模糊查也会导致全表扫描,通常是使用的搜索引擎框架的分词器来实现模糊查

    7.尽量避免*号,而使用字段名来代替

    8.尽量使用union all 来代替union

    9.尽量使用 <= , >= 来代替beetween and




    参考文章:
    数据库性能优化:https://www.cnblogs.com/luxiaoxun/p/4694144.html
    三大范式:https://www.cnblogs.com/1906859953Lucas/p/8299959.html




  • 相关阅读:
    博客园 Open Live Writer 博客编辑工具&代码高亮显示插件 安装使用说明
    测试高亮代码
    Linux 查看操作系统版本信息 uname
    Linux 查看登录用户信息 who & whoami
    Linux crontab 每5秒钟执行一次 shell 脚本 的方法
    Linux 查找特定程序 whereis
    Java 语言实现 MD5 加密
    Maven 官网 查找&下载 jar包& pom引用 完美方案
    ArcGIS Engine 10.x许可代码
    IIS 无法显示网页 目前访问网站的用户过多
  • 原文地址:https://www.cnblogs.com/blackjoyful/p/11547005.html
Copyright © 2011-2022 走看看