数据库主键

MySQL索引&&开发规范

三世轮回 提交于 2019-11-30 05:38:15
规范总结 索引规范 默认添加的索引都是BTree索引。Innodb只支持BTree索引。 设计索引原则 - 最适合索引的列是WHERE子句中的列,而不是SELECT中的列。 - 如果索引的字段很长,使用前缀索引 - 删除不常用索引 - 建议单表不超过5个 单表索引不超过5个【索引可以提高查询效率,但是会减小插更新效率】 每个 Innodb 表必须有个主键,【主键建议使用自增 ID 值】 索引列建议 出现在 SELECT、UPDATE、DELETE 语句的 WHERE 从句中的列 包含在 ORDER BY、GROUP BY、DISTINCT 中的字段 并不要将符合 1 和 2 中的字段的列都建立一个索引, 通常将 1、2 中的字段建立联合索引效果更好 多表 join 的关联列 避免建立冗余索引和重复索引 重复索引示例:primary key(id)、index(id)、unique index(id) 冗余索引示例:index(a,b,c)、index(a,b)、index(a) 覆盖索引 to be continue 外键约束取舍 开发规范 禁止使用 SELECT * 必须使用 SELECT 查询 用join操作代替子查询 使用join关联的表最好不超过5个 对应同一列进行 or 判断时,使用 in 代替 or 禁止使用 order by rand() 进行随机排序

了解数据库

Deadly 提交于 2019-11-30 04:35:10
数据库基础 你可能还没有意识到,其实自己一直在使用数据库,在电子邮件地址簿里查找名字时,在搜索网站站点上进行搜索, 都是在使用数据库 数据库 数据库这个术语的用法很多,理解数据库最简单时方法是将其想象为一个文件柜,此文件柜是一个存放数据的物理位 置,不管数据是什么以及如何组成的 数据库(database): 保存有组织的数据的容器 表 当你将资料放入自己的文件柜时,并不是随便将它们扔进某个抽屉(数据库)中,而是在抽屉中创建文件(表),然后将相关的资料 放入特定的文件中 表(table) 某种特定类型数据的结构化清单 存储在表中的数据应该是一种类型的 数据库中的每个表都有一个名字,用来标示自己。此名字时唯一的。这表示数据库中没有其他表具有相同的名字 列 列(column)表中的一个字段,所有表都是由一个或者多个列组成的 理解列的最好办法就是将数据库表想成一个网格,网格中每一列存储着一条特定的信息 比如在顾客表中,一个列存储着顾客编号,一个列存储着着顾客姓名,地址和联系方式等其他信息都存储在各自的列中 数据类型 数据库中每个列都有相关的数据类型,数据类型定义列可以存储的数据种类 数据类型(datatype) 所容许的数据的类型,每个表列都有相应的数据类型,它限制该列存储的数据 数据类型还帮助正确的排序数据,并在优化磁盘使用方面起到重要的作用。因此,在创建表时必须对数据类型给予特别的关注

MySQL中的KEY, PRIMARY KEY, UNIQUE KEY , INDEX 的区别

流过昼夜 提交于 2019-11-30 04:26:57
-----------转载-----------------------:原文: https://www.cnblogs.com/zjfjava/p/6922494.html 索引: 被用来快速找出在一个列上用一特定值的行。没有索引,MySQL不得不首先以第一条记录开始并然后读完整个表直到它找出相关的行。 表越大,花费时间越多。如果表对于查询的列有一个索引,MySQL能快速到达一个位置去搜寻到数据文件的中间,没有必要考虑所有数据。 如果一个表有1000行,这比顺序读取至少快100倍。注意你需要存取几乎所有1000行,它较快的顺序读取,因为此时我们避免磁盘寻道。 所有的MySQL 索引 (PRIMARY、UNIQUE和INDEX) 在B树中存储 。字符串是自动地压缩前缀和结尾空间。 索引用于: 快速找出匹配一个WHERE子句的行; 当执行联结时,从其他表检索行; 对特定的索引列找出MAX()或MIN()值; 如果排序或分组在一个可用键的最左面前缀上进行(例如,ORDER BY key_part_1,key_part_2),排序或分组一个表。 如果所有键值部分跟随DESC,键以倒序被读取。 在一些情况中,一个查询能被优化来检索值,不用咨询数据文件。 如果对某些表的所有使用的列是数字型的并且构成某些键的最左面前缀,为了更快,值可以从索引树被检索出来。 PRIMARY KEY: mysql

mysql学习

眉间皱痕 提交于 2019-11-30 04:05:42
数据库操作: 创建一个数据表 CREATE TABLE IF NOT EXISTS 表名( 字段名1 类型(长度) 约束1 约束2 ... 注释, 字段名2 类型(长度) 约束1 约束2 ... 注释, ... 字段名n 类型(长度) 约束1 约束2 ... 注释 )DEFAULT CHARSET = UTF8; 查看数据库的编码方式 SHOW CREATE DATABASE 库名; 写出MySQL常用的数据类型, 至少写4种。 TINYINT INT BIGINT 整型 DATE TIME DATETIME TIMESTAMP 时间日期 CHAR VARCHAR TEXT LONGTEXT 字符串 ENUM("值1","值2","值3",...) 枚举 FLOAT(5,2) 一共5位数,2位小数 DOUBLE(5,2) 一共5位数,2位小数 MySQL约束条件: 1、约束条件的背景 数据表的字段如果没有任何规范和限制, 会产生数据冗余,不方便项目的使用和管理。 2、约束条件 PRIMARY KEY :主键约束, 相当于一个表中的序号,主键的值唯一不重复, 可以用来标志一行数据,一般使用整数。 主键默认不能重复,不需要加UNIQUE KEY; 主键默认不能为空,不需要加NOT NULL; 主键 PRIMARY KEY 加上 AUTO_INCREMENT 之后不需要给值,会自动增长。

项目常见面试问题

亡梦爱人 提交于 2019-11-30 02:10:35
项目常见面试问题 阅读目录 项目常见面试问题 回到目录 项目常见面试问题 一、你的项目中缓存粒度是如何选择的? 缓存粒度一共分为4种. 1.缓存某个数值:一个键只保存一个值,性价比较低,使用率低,如果存储的话我们使用redis的String 2.缓存数据对象:数据库记录对应的具体数据,优点是可以多次复用,String,hash 3.缓存数据集合:数据库查询对应的结果集,可以和数据对象配合使用,方便数据对象的重用,hash,list,set,zset,String(zset,String) 4.缓存试图响应:试图返回的相应数据,复用性比较差,String 所以我们项目中主要对数据集合+数据对象进行缓存,他们的优点是复用性强,节省内存空间. 二、使用过redis的那些格式做过缓存,其他应用场景和优缺点是什么? 包括list,zset,set,hash和json字符串 其中我们使用过json字符串和zset set用来存放无序去重的数据, 如果有判断是否存在的需求 zset有排序的需要list,如果说是按时间查询, 查询的结果固定, 不需要分页的情况下,我们使用list因为查询的比较快 但如果有额外排序要求, 而且需要分页, 我们使用zset(查询时间跟查询的长度和数据量有关,跟查询区别无关, 查询速度比较均衡), 增加数据效率和存储的数据量负相关,数据量越大,添加时间越长

MySQL表的完整性约束

前提是你 提交于 2019-11-29 21:46:06
一 介绍   约束条件与数据类型的宽度一样,都是可选参数   作用:用于保证数据的完整性和一致性   主要分为: PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯一的标识记录 FOREIGN KEY (FK) 标识该字段为该表的外键 NOT NULL 标识该字段不能为空 UNIQUE KEY (UK) 标识该字段的值是唯一的 AUTO_INCREMENT 标识该字段的值自动增长(整数类型,而且为主键) DEFAULT 为该字段设置默认值 UNSIGNED 无符号 ZEROFILL 使用0填充   说明:    1. 是否允许为空,默认NULL,可设置NOT NULL,字段不允许为空,必须赋值 2. 字段是否有默认值,缺省的默认值是NULL,如果插入记录时不给字段赋值,此字段使用默认值 sex enum('male','female') not null default 'male' age int unsigned NOT NULL default 20 必须为正值(无符号) 不允许为空 默认是20 3. 是否是key 主键 primary key 外键 foreign key 索引 (index,unique...) 二 not null与default   是否可空,null表示空,非字符串   not null - 不可空   null - 可空    ​  

hibernate 主键生成方式

不羁的心 提交于 2019-11-29 20:06:07
<id name="id" type="java.lang.String"> <column name="id" length="50" /> <generator class="native" /> </id> Hibernate主键生成方式 Key Generator主键产生器 可选项说明: 1) assigned 主键由外部程序负责生成,无需Hibernate参与。 2) hilo 通过hi/lo 算法实现的主键生成机制,需要额外的数据库表保存主键生成历史状态。 3) seqhilo 与hilo 类似,通过hi/lo 算法实现的主键生成机制,只是主键历史状态保存在Sequence中,适用于支持Sequence的数据库,如Oracle。 4) increment 主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候 将此值加1作为主键。这种方式可能产生的问题是:如果当前有多个实例访问同一个数据库,那么由于各个实例各自维护主键状态,不同实例可能生成同样 的主键,从而造成主键重复异常。因此,如果同一数据库有多个实例访问,此方式必须避免使用。 5) identity 采用数据库提供的主键生成机制。如DB2、SQL Server、MySQL中的主键生成机制。 6) sequence 采用数据库提供的sequence

Mysql高性能优化规范建议

拥有回忆 提交于 2019-11-29 18:28:33
阅读目录(Content) 数据库命令规范 数据库基本设计规范 1. 所有表必须使用Innodb存储引擎 2. 数据库和表的字符集统一使用UTF8 3. 所有表和字段都需要添加注释 4. 尽量控制单表数据量的大小,建议控制在500万以内 5. 谨慎使用Mysql分区表 6. 尽量做到冷热数据分离,减小表的宽度 7. 禁止在表中建立预留字段 8. 禁止在数据库中存储图片,文件等大的二进制数据 9. 禁止在线上做数据库压力测试 10. 禁止从开发环境,测试环境直接连接生成环境数据库 数据库字段设计规范 1. 优先选择符合存储需要的最小的数据类型 2. 避免使用TEXT、BLOB数据类型,最常见的TEXT类型可以存储64k的数据 3. 避免使用ENUM类型 4. 尽可能把所有列定义为NOT NULL 5. 使用TIMESTAMP(4个字节)或DATETIME类型(8个字节)存储时间 6. 同财务相关的金额类数据必须使用decimal类型 索引设计规范 1. 限制每张表上的索引数量,建议单张表索引不超过5个 2. 禁止给表中的每一列都建立单独的索引 3. 每个Innodb表必须有个主键 常见索引列建议 如何选择索引列的顺序 避免建立冗余索引和重复索引(增加了查询优化器生成执行计划的时间) 对于频繁的查询优先考虑使用覆盖索引 索引SET规范 尽量避免使用外键约束 数据库SQL开发规范 1.

MyISAM InnoDB索引实现

↘锁芯ラ 提交于 2019-11-29 18:22:31
MyISAM索引实现 MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址。如图: 这里设表一共有三列,假设我们以Col1为主键,则上图是一个MyISAM表的主索引(Primary key)示意。可以看出MyISAM的索引文件仅仅保存数据记录的地址。在MyISAM中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复。如果我们在Col2上建立一个辅助索引,则此索引的结构如下图所示: 同样也是一颗B+Tree,data域保存数据记录的地址。因此,MyISAM中索引检索的算法为首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其data域的值,然后以data域的值为地址,读取相应数据记录。 MyISAM的索引方式也叫做“非聚集”的,之所以这么称呼是为了与InnoDB的聚集索引区分。 InnoDB索引实现 虽然InnoDB也使用B+Tree作为索引结构,但具体实现方式却与MyISAM截然不同。 第一个重大区别是InnoDB的数据文件本身就是索引文件。从上文知道,MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录

mysql数据库优化概述详解

十年热恋 提交于 2019-11-29 18:05:09
mysql查询的过程图 为什么要优化 系统的吞吐量瓶颈往往出现在数据库的访问速度上 随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢 数据是存放在磁盘上的,读写速度无法和内存相比 如何优化 设计数据库时:数据库表、字段的设计,存储引擎 利用好MySQL自身提供的功能,如索引等 横向扩展:MySQL集群、负载均衡、读写分离 SQL语句的优化(收效甚微) 一、字段设计阶段 选取最适用的字段属性 1. 字段的宽度设得尽可能小 MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快。因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽可能小。 2. 尽量把字段设置为NOTNULL 在可能的情况下,应该尽量把字段设置为NOTNULL,这样在将来执行查询的时候,数据库不用去比较NULL值。 3. 确定数据定义为ENUM类型 对于某些文本字段,例如“省份”或者“性别”,我们可以将它们定义为ENUM类型。因为在MySQL中,ENUM类型被当作数值型数据来处理,而数值型数据被处理起来的速度要比文本类型快得多。这样,我们又可以提高数据库的性能。 4. 单表字段不宜过多,可以预留字段 满足业务需求的前提下二三是个字段就是极限了,可以预留字段便于扩展。 遵循数据表的设计规范 1. 第一范式(1NF) 字段值具有原子性