当前位置: 首页 > news >正文

数据库基础常用知识

一,关系数据库三大范式

第一范式要求每一列都不可再分,即要满足原子性,这也是关系数据库设计中最基本都要求。第二范式是在它基础上要求所有非主键列都要完全依赖主键列,而不能只依赖部分主键列(若有此情况,应该拆分表)。第三范式是在第二范式基础上要求所有非主键列都必须要直接依赖主键列,而不是依赖某非主键列进而间接依赖主键列,比如用户表有用户id、用户名、组织id、组织名称字段时就不满足第三范式,因为组织名称是直接依赖组织id的。不过实际在关系数据库表设计时为了减少关联表查询都会采用这种冗余设计。

二、数据库表连间的连接关系

常见的数据库表间连接关系分为内连接、外连接、左(右)外连接、交叉连接几种。其中内连接返回两个表中满足条件的记录,外连接(全外连接)返回两个表中所有记录(包括满足条件的记录,其它左边表记录+右边表字段为空,其它右边表记录+左边表字段为空),左外连接以左边表为准,返回所有左边表记录(右边表不存在关联记录的返回空),交叉连接是返回两边记录的乘积。

三、数据库索引概念及注意事项

数据库索引目的是为了增加记录的查询排序效率,避免全表扫描提升效率,尤其是在表数据多情况下,正确使用索引能极大提高数据库的查询效率。通常数据库索引使用B+树结构,其它类似常用的索引结构有Hash索引、LSM树索引。

从记录顺序与物理磁盘顺序是否一致的角度看索引分为聚簇索引和非聚簇索引。聚簇索引是指索引记录顺序与物理记录顺序一致,查询效率更高,更适用于区间记录查询,每个表只能建一个聚簇索引,默认在建表主键时会把它设置为聚簇索引(如果要设置其它列为聚簇索引,要在指定主键前设置)。

常见索引分类有普通索引(常见的索引)、唯一索引(列值唯一的索引,允许空值)、主键索引(特殊的唯一索引)、单例索引、联合索引。使用索引有以下注意事项:

  1. 避免过度使用索引,如果表记录不多,或者是重复记录很多(比如性别列),或者表的增、改、删很频繁,不建议使用索引,因为索引效果不明显还增加了维护成本。
  2. 合理使用索引,尤其是联合索引,应将区分记录更多、查询条件在前的列放在联合索引的前面,避免像MySQL数据库左联合索引规则(假设联合索引列为a、b、c时如果条件中没有a列则不起作用,PgSql似乎没这个问题)。
  3. 任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。
  4. in、or子句常会使用工作表,使索引失效;如果不产生大量重复值,可以考虑把子句拆开;拆开的子句中应该包含索引。

哪些情况需要建索引:
1 主键,唯一索引
2 经常用作查询条件的字段需要创建索引
3 经常需要排序、分组和统计的字段需要建立索引
4 查询中与其他表关联的字段,外键关系建立索引

哪些情况不要建索引:
1 表的记录太少,百万级以下的数据不需要创建索引
2 经常增删改的表不需要创建索引
3 数据重复且分布平均的字段不需要创建索引,如 true,false 之类。
4 频发更新的字段不适合创建索引
5 where条件里用不到的字段不需要创建索引

索引的一些总结

Mysql 索引优化分析

四、关系数据库表中不应存的三类值

  1. 大文件、声音图片文件,虽然数据库字段有blog类型,但最后还是不要直接将文件存入数据库,而是通过存入对应文件路径解决。因为通过数据库操作速度不如直接操作文件快,会增大数据库文件备份迁移数据麻烦。有网友表示在MySQL数据库中存储图片文件列,虽然在查询中不含该字段也会拖慢查询效率。
  2. 临时数据,比如session、每小时、天会过期清理的数据不应该存在数据库中,存在Redis之类的缓存中更合适。
  3. 大量日志文件,如果想将日志存入数据库以方便日志的查询最好也是单独建立日志库,避免因为频繁写入日志而影响主业务表的访问效率。

相关文章:

  • “阿里架构师”的JVM之GC详解
  • 干货云集 WOT2016峰会揭密大数据背后的技术难点
  • 收藏好这篇,别再只说“数据劫持”了
  • input框限制只能输入正整数、字母、小数、汉字
  • MySQL 技术总结
  • 浅论各种调试接口(SWD、JTAG、Jlink、Ulink、STlink)的区别
  • 手把手教你如何安装Pycharm——靠谱的Pycharm安装详细教程
  • 腾讯TBS加载网页无法自适应记录
  • CPU状态信息us,sy,ni,id,wa,hi,si,st含义
  • QuickBI助你成为分析师——计算字段功能
  • 基于ASP.NET MVC 微信网页登录授权(scope为snsapi_base) 流程 上 获取OPENID
  • PHP数字字符串左侧补0、字符串填充和自动补齐的几种方法
  • composer移除依赖包
  • 在Linux,误删磁盘分区怎么恢复呢【转】
  • 纯html页面中js如何获得项目路径
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • 【css3】浏览器内核及其兼容性
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • 【翻译】babel对TC39装饰器草案的实现
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • JS字符串转数字方法总结
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • React+TypeScript入门
  • SpingCloudBus整合RabbitMQ
  • ViewService——一种保证客户端与服务端同步的方法
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • 阿里云购买磁盘后挂载
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 从tcpdump抓包看TCP/IP协议
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 服务器从安装到部署全过程(二)
  • 构建二叉树进行数值数组的去重及优化
  • 回顾2016
  • 基于组件的设计工作流与界面抽象
  • 排序(1):冒泡排序
  • 前端
  • 如何编写一个可升级的智能合约
  • 使用putty远程连接linux
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 一起参Ember.js讨论、问答社区。
  • 回归生活:清理微信公众号
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (4)事件处理——(7)简单事件(Simple events)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (三分钟)速览传统边缘检测算子
  • (一)Mocha源码阅读: 项目结构及命令行启动