数据库主键

数据库设计

这一生的挚爱 提交于 2019-11-27 15:59:58
toB 应用设计系列 - 导航 适用范围 本文仅适用于 mysql 数据库 原则 数据库只做存储使用, 计算 / 业务逻辑放到应用层 尽量遵循三范式 高级功能 禁止使用触发器 / 存储过程 / 函数 / 视图 触发器非常影响插入 / 更新 / 删除 的效率, 触发器的功能可由应用层来实现 一旦放开存储过程/函数的限制, 不能保证人们会用存储过程/函数来做什么, 极有可能在存储过程/函数里进行大量的运算, 或者将业务逻辑写入; 另外, 大多数缓存在应用层实现, 存储过程/函数就无法复用缓存 触发器 / 存储过程 / 函数 / 视图 没有版本管理 字段 通用字段 主键id: 尽量使用单一逻辑主键, 实体使用单一逻辑主键, 关联关系可使用复合主键; 坚决不使用业务主键, 只使用逻辑主键 实体一般拥有业务唯一标识 no 创建时间 create_time 更新时间 update_time 数据类型 字符串类型 定长字符串: char(n) 不定长字符串: varchar(n) 长文本 text 整数类型 无符号 unsigned 类型 范围(有符号) 范围(无符号) tinyint (-128,127) (0,255) smallint (-32 768,32 767) (0,65 535) mediumint (-8 388 608,8 388 607) (0,16 777 215)

mysql之索引的数据结构

不羁岁月 提交于 2019-11-27 15:38:53
目录 一、树 二、B+树 2.1 B+树性质 三、聚集索引和辅助索引 3.1 聚集索引 3.2 辅助索引 3.3 聚集索引和非聚集索引的区别 四、再看B+树 4.1 B+树的插入操作 4.2 B+树的删除操作 一、树 树状图是一种 数据结构 ,它是由n(n>=1)个有限结点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。 它具有以下的特点:每个结点有零个或多个子结点;没有父结点的结点称为根结点;每一个非根结点有且只有一个父结点;除了根结点外,每个子结点可以分为多个不相交的子树 根结点:A 父节点:A是B,C的父节点 叶子节点:D,E是叶子节点 树的深度/树的高度:高度为3 二、B+树 前面讲了索引的基本原理,数据库的复杂性,又讲了操作系统的相关知识,目的就是让大家了解,任何一种数据结构都不是凭空产生的,一定会有它的背景和使用场景,我们现在总结一下,我们需要这种数据结构能够做些什么,其实很简单,那就是:每次查找数据时把磁盘IO次数控制在一个很小的数量级,最好是常数数量级。那么我们就想到如果一个高度可控的多路搜索树是否能满足需求呢?就这样,b+树应运而生(B+树是通过二叉查找树,再由平衡二叉树,B树演化而来)。 2.1 B+树性质 索引字段要尽量的小: 通过上面的分析,我们知道IO次数取决于b+数的高度h,假设当前数据表的数据为N

【MySQL】索引相关 -- 2019-08-17 04:23:57

别说谁变了你拦得住时间么 提交于 2019-11-27 14:30:14
原文: http://blog.gqylpy.com/gqy/253 " 目录 普通索引 唯一索引 主键索引 组合索引 正确使用索引的情况 索引的注意事项 执行计划 axplain 慢日志记录 分页性能相关方案 索引是数据库中专门用于帮助用户快速查找数据的一种数据结构. 类似于字典中的目录,查找字典内容可以根据目录查找到数据的存放位置,然后直接获取. 作用:约束和加速查找 常见的几种索引: - 普通索引 - 唯一索引 - 主键索引 - 联合索引(多列) -- 联合主键索引 -- 联合唯一索引 -- 联合普通索引 无索引和有索引的区别: 无索引: 从前往后一条一条查询. 有索引: 创建索引的本质,就是创建额外的文件,以某种格式存储,查询的时候,先去额外的文件找,确定了位置,然后再去原始表中直接查询,但是创建的索引越多,越会对硬盘有损耗. ——————————— 建立索引的目的: 额外的文件保存特殊的数据结构 查询快,但是插入更新删除依旧慢 创建索引之后,必须命中索引才能有效 索引的种类: hash索引: 查询单条快,范围查询慢 btre类索引: b+树,层数增多,数据量指数级增长 (InnoDB默认支持btree索引,这里就使用它) 索引名词: 覆盖索引: 在索引文件中直接获取数据 (例如:select name from userinfo where name = 'zyk';)

【MySQL】索引相关 -- 2019-08-17 04:16:45

情到浓时终转凉″ 提交于 2019-11-27 14:29:42
原文: http://blog.gqylpy.com/gqy/253 " 目录 普通索引 唯一索引 主键索引 组合索引 正确使用索引的情况 索引的注意事项 执行计划 axplain 慢日志记录 分页性能相关方案 索引是数据库中专门用于帮助用户快速查找数据的一种数据结构. 类似于字典中的目录,查找字典内容可以根据目录查找到数据的存放位置,然后直接获取. 作用:约束和加速查找 常见的几种索引: - 普通索引 - 唯一索引 - 主键索引 - 联合索引(多列) -- 联合主键索引 -- 联合唯一索引 -- 联合普通索引 无索引和有索引的区别: 无索引: 从前往后一条一条查询. 有索引: 创建索引的本质,就是创建额外的文件,以某种格式存储,查询的时候,先去额外的文件找,确定了位置,然后再去原始表中直接查询,但是创建的索引越多,越会对硬盘有损耗. ——————————— 建立索引的目的: 额外的文件保存特殊的数据结构 查询快,但是插入更新删除依旧慢 创建索引之后,必须命中索引才能有效 索引的种类: hash索引: 查询单条快,范围查询慢 btre类索引: b+树,层数增多,数据量指数级增长 (InnoDB默认支持btree索引,这里就使用它) 索引名词: 覆盖索引: 在索引文件中直接获取数据 (例如:select name from userinfo where name = 'zyk';)

orm,思路详解

萝らか妹 提交于 2019-11-27 13:38:18
第一部分 from mysql_singleton import MySql # 先创建字段类 class Field(object): def __init__(self, name, column_type, primary_key, default): self.name = name self.column_type = column_type self.primary_key = primary_key self.default = default # 我们在创建一个简短的字段类 # 比如int类型的字段类 class IntegerField(Field): def __init__(self, name, column_type="int", primary_key=False, default=0): # 一定要调用父类的__init__方法 super().__init__(name, column_type, primary_key, default) # 在定义一个str字段的类 class StringField(Field): def __init__(self, name, column_type="varchar(32)", primary_key=False, default=None): # 一定要调用父类的__init__方法 super()._

了解MyISAM与InnoDB的索引差异(转)

孤人 提交于 2019-11-27 12:06:57
出处原文: 1分钟了解MyISAM与InnoDB的索引差异 数据库的索引分为 主键索引 (Primary Inkex)与 普通索引 (Secondary Index)。InnoDB和MyISAM是怎么利用B+树来实现这两类索引,其又有什么差异呢?这是今天要聊的内容。 一,MyISAM的索引 MyISAM的 索引与行记录是分开存储的 ,叫做 非聚集索引 (UnClustered Index)。 其主键索引与普通索引没有本质差异: 有连续聚集的区域 单独存储行记录 主键索引的叶子节点,存储主键,与对应行记录的 指针 普通索引的叶子结点,存储索引列,与对应行记录的 指针 画外音:MyISAM的表可以没有主键。 主键索引与普通索引是两棵独立的索引B+树,通过索引列查找时,先定位到B+树的叶子节点,再通过指针定位到行记录。 举个例子,MyISAM: t(id PK, name KEY, sex, flag); 表中有四条记录: 1, shenjian, m, A 3, zhangsan, m, A 5, lisi, m, A 9, wangwu, f, B 其B+树索引构造如上图: 行记录单独存储 id为PK,有一棵id的索引树,叶子指向行记录 name为KEY,有一棵name的索引树,叶子也指向行记录 二、InnoDB的索引 InnoDB的 主键索引与 行记录是存储在一起的,故叫做

php面试题

一世执手 提交于 2019-11-27 09:42:10
文章转载自: http://www.pythonheidong.com/blog/article/2220/ php面试题 php 面试 最近一直在面试,所以总结了下常见的 PHP 面试题. PHP基础题目 安全对一套程序来说至关重要,请说说在开发中应该注意哪些安全机制? ①防远程提交; ②防SQL注入,对特殊代码进行过滤; ③防止注册机灌水,使用验证码; 在程序的开发中,如何提高程序的运行效率? ①优化SQL语句,查询语句中尽量不使用select *,用哪个字段查哪个字段;少用子查询可用表连接代替;少用模糊查询 ②数据表中创建索引 ③对程序中经常用到的数据生成缓存 现在编程中经常采取MVC三层结构,请问MVC分别指哪三层,有什么优点? MVC三层分别指:业务模型、视图、控制器,由控制器层调用模型处理数据,然后将数据映射到视图层进行显示,优点是: ①可以实现代码的重用性,避免产生代码冗余 ②M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式 对json数据格式的理解? JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,json数据格式固定,可以被多种语言用作数据的传递 PHP中处理json格式的函数为json_decode( string $json [, bool $assoc ] ) ,接受一个

MySql 面试开发技术点汇总

核能气质少年 提交于 2019-11-27 08:45:42
1、为什么一定要设一个主键?  答: 因为你不设主键的情况下,innodb也会帮你生成一个隐藏列,作为自增主键。所以啦,反正都要生成一个主键,那你还不如自己指定一个主键,在有些情况下,就能显式的用上主键索引,提高查询效率! 2、你们主键是用自增还是UUID?   答: 肯定答自增啊。innodb中的主键是聚簇索引。如果主键是自增的,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页。如果不是自增主键,那么可能会在中间插入,就会引发页的分裂,产生很多表碎片!。   上面那句话看不懂没事,大白话一句就是:用自增插入性能好!   另外,附一个测试表给你们,表名带uuid的就是用uuid作为主键。大家看一下就知道性能差距了:   如上图所示,当主键是UUID的时候,插入时间更长,而且占用空间更大!   额,大家千万不要忘了,当你回答自增主键后,想一下《自增主键用完该怎么办?》 3、主键为什么不推荐有业务含义?  答: 有如下两个原因   (1)因为任何有业务含义的列都有改变的可能性,主键一旦带上了业务含义,那么主键就有可能发生变更。主键一旦发生变更,该数据在磁盘上的存储位置就会发生变更,有可能会引发页分裂,产生空间碎片。   2)带有业务含义的主键,不一定是顺序自增的。那么就会导致数据的插入顺序,并不能保证后面插入数据的主键一定比前面的数据大

mysql面试题(1)

末鹿安然 提交于 2019-11-27 08:36:19
出处来源:https://www.cnblogs.com/frankielf0921/p/5930743.html 1.主键,超键,候选键,外键    主键:一个表的唯一标识符,具有唯一和非空的属性。   超键:在关系中能唯一标识元组的属性集称为关系模式的超键,变相的来说就是和的主键连在一起的属性集都属于超键   候选键:不含有多余属性的键称之为候选键,这里是主键的集合称之为候选键   外键:一个表中的键是另外一个表的主键,意思很清楚,外键必须要有两个表,其中一个表的键在另外一个表中是主键的属性 实例讲解:       这里有一个学生表student(学号,班级,年龄,身份证) 和 成绩表course(学号,课程,成绩)       1、然我们先来讨论超键,这里举例学生表超键可以有(学号),(学号,班级),(学号,年龄,班级)这里只要包含唯一属性学号,和身份证都可称之为超键       2、接下来是主键,主键具有唯一标识符,非空,唯一的属性,这里学号,和身份证都可以用来标识一个人,都可以作为主键,如果要同时用两个主键才能标识一个事物那么我们称之为复合主键,这里我们只要定一个主键就可找到一个人,就不用复合主键了,任选其一作为主键就可以了       3、候选键是主键的集合,上面我们可以把身份证或学号定义为主键,那么这两者在这里都属性候选键,主键是从候选键里面选出来的,很好理解。  

数据库范式

我与影子孤独终老i 提交于 2019-11-27 08:34:49
1NF:每一列不能再进行拆分,例如:Col列中存在'AA,123'值,这种就不行,拆分成两列, 2NF:必须完全依赖于主键,不能只依赖多个主键中的某一个,例如:主键为ID1,ID2,其他列Col1,Col2,Col1和Col2都必须依赖ID1和ID2,不能说是Col1只依赖ID1; 3NF:除主键外的列不能相互依赖,例如ID1为主键,Col1,Col2,Col3为其他列,Col2不能依赖于Col1,必须依赖ID1 来源: https://www.cnblogs.com/zgzjmbs/p/11354828.html