主键约束

MySQL count知多少

旧巷老猫 提交于 2020-04-05 16:51:11
统计一个表的数据量是经常遇到的需求,但是不同的表设计及不同的写法,统计性能差别会有较大的差异,下面就简单通过实验进行测试( 大家测试的时候注意缓存的情况,否则影响测试结果 )。 1、 准备工作 为了后续测试工作的进行,先准备几张用于测试的表及数据,为了使测试数据具有参考意义,建议测试表的数据量大一点,以免查询时间太小,因此,可以继续使用之前常用的连续数生成大法,如下: /* 创建连续数表 */ CREATE TABLE nums(id INT primary key); /* 生成连续数的存储过程,优化过后的 */ DELIMITER $$ CREATE PROCEDURE `sp_createNum`(cnt INT ) BEGIN DECLARE i INT DEFAULT 1; TRUNCATE TABLE nums; INSERT INTO nums SELECT i; WHILE i < cnt DO BEGIN INSERT INTO nums SELECT id + i FROM nums WHERE id + i<=cnt; SET i = i*2; END; END WHILE; END$$ DELIMITER ; 生成数据,本次准备生成1kw条记录 /* 调用存储过程 */ mysql> call sp_createNum(10000000); Query OK

T- SQL性能优化详解 http://www.cnblogs.com/weixing/p/3357519.html

让人想犯罪 __ 提交于 2020-04-03 21:48:14
T- SQL性能优化详解 http://www.cnblogs.com/weixing/p/3357519.html 故事开篇:你和你的团队经过不懈努力,终于使网站成功上线,刚开始时,注册用户较少,网站性能表现不错,但随着注册用户的增多,访问速度开始变慢,一些用户开始发来邮件表示抗议,事情变得越来越糟,为了留住用户,你开始着手调查访问变慢的原因。   经过紧张的调查,你发现问题出在数据库上,当应用程序尝试访问/更新数据时,数据库执行得相当慢,再次深入调查数据库后,你发现数据库表增长得很大,有些表甚至有上千万行数据,测试团队开始在生产数据库上测试,发现订单提交过程需要花5分钟时间,但在网站上线前的测试中,提交一次订单只需要2/3秒。   类似这种故事在世界各个角落每天都会上演,几乎每个开发人员在其开发生涯中都会遇到这种事情,我也曾多次遇到这种情况,因此我希望将我解决这种问题的经验和大家分享。   如果你正身处这种项目,逃避不是办法,只有勇敢地去面对现实。首先,我认为你的应用程序中一定没有写数据访问程序,我将在这个系列的文章中介绍如何编写最佳的数据访问程序,以及如何优化现有的数据访问程序。    范围   在正式开始之前,有必要澄清一下本系列文章的写作边界,我想谈的是“事务性(OLTP)SQL Server数据库中的数据访问性能优化”,但文中介绍的这些技巧也可以用于其它数据库平台。  

sql_基础学习_关系模型_主键,外键,索引

99封情书 提交于 2020-03-29 13:36:11
关系数据库是建立在关系模型上的。而关系模型本质上就是若干个存储数据的二维表,可以把它们看作很多Excel表。 表的每一行称为记录(Record),记录是一个逻辑意义上的数据。 表的每一列称为字段(Column),同一个表的每一行记录都拥有相同的若干字段。 字段定义了数据类型(整型、浮点型、字符串、日期等),以及是否允许为 NULL 。注意 NULL 表示字段数据不存在。一个整型字段如果为 NULL 不表示它的值为 0 ,同样的,一个字符串型字段为 NULL 也不表示它的值为空串 '' 。——NULL是不可以和0以及' '比较的。 关系数据库的表和表之间需要建立“一对多”,“多对一”和“一对一”的关系,这样才能够按照应用程序的逻辑来组织和存储数据。 在关系数据库中,关系是通过主键和外键来维护的。 1,主键: 能够通过某个字段唯一区分出不同的记录,这个字段被称为主键; 在关系数据库中,一张表中的每一行数据被称为一条记录。一条记录就是由多个字段组成的。每一条记录都包含若干定义好的字段。同一个表的所有记录都有相同的字段定义。 关系表约束:任意两条记录不能重复; 主键要求:记录一旦插入到表中,主键最好不要再修改,因为主键是用来唯一定位记录的,修改了主键,会造成一系列的影响; 选取主键基本原则:不使用任何业务相关的字段作为主键; 作为主键最好是完全业务无关的字段,我们一般把这个字段命名为 id

all index range ref eq_ref const system 索引type说明

こ雲淡風輕ζ 提交于 2020-03-28 23:19:57
背景知识 在使用sql的过程中经常需要建立索引,而每种索引是怎么处罚的又是怎么起到作用的,首先必须知道索引和索引的类型。 索引类型 type 我们可以清楚的看到 type 那一栏有 index ALL eq_ref ,他们都代表什么意思呢? 首先类型有许多,这里我只给大家介绍用的最多的 几种 类型: system>const>eq_ref>ref>range>index>ALL 越往左边,性能越高, 比如 system 就比 ALL 类型性能要高出许多 ,其中 system 、 const 只是理想类型,基本达不到; 我们自己实际能优化到 ref>range 这两个类型,就是你自己写 SQL ,如果你没优化基本上就是 ALL ,如果你优化了,那就尽量达到 ref>range 这两个级别; 左边基本达不到! 所以,要对 type 优化的前提是, 你需要有索引,如果你连索引都没有创建,那你就不用优化了,肯定是 ALL..... ; Type 级别详解 一 .system 级别 索引类型能是 system 的只有两种情况: 1. 只有一条数据的系统表 只有一条数据的系统表,就是系统里自带一张表,并且这个表就一条数据,这个基本上就达不到,这个是系统自带的表,而且就一条数据,所以基本达不到; 2. 或衍生表只能有一条数据的主查询 这个是可以实现的,但是在实际开发当中

主键与索引

为君一笑 提交于 2020-03-25 12:26:20
3 月,跳不动了?>>> 唯一索引 :该字段没有重复值,但允许空值(该字段可以有多个null值) ,一张table只允许一个主键,但可以创建多个unique index 函数索引: 如果在我们的查询条件使用了函数,那么索引就不可用了。可以用建立函数索引的方式,来解决这个问题   例如:    select * from product where nvl(price,0.0)>1000.0 ;    这里,nvl(price,0.0)使用了函数,索引不能利用price字段上做的索引了   我们来创建函数索引    create index index_price on product(nvl(price,0.0)); 其他: 1. 创建表时,不能在同一个字段上建立两个索引(主键默认建立唯一索引) 。 2. 唯一索引能极大的提高查询速度,而且还有唯一约束的作用。一般索引,只能提高30%左右的速度 经常插入,修改,应在查询允许的情况下,尽量减少索引,因为添加索引,插入,修改等操作,需要更多的时间 3. 主键一定是唯一性索引,唯一性索引并不一定就是主键。 4. 一个表中可以有多个唯一性索引,但只能有一个主键。 5. 主键列不允许空值,而唯一性索引列允许空值。 主键和索引都是键,不过主键是逻辑键,索引是物理键,意思就是主键不实际存在,而索引实际存在在数据库中 来源: oschina 链接:

Hibernate学习之映射关系

 ̄綄美尐妖づ 提交于 2020-03-23 05:31:05
一、Hibernate多对一关联映射:就是在“多”的一端加外键,指向“一”的一端。   比如多个学生对应一个班级,多个用户对应一个级别等等,都是多对一关系。      1、“多”端实体加入引用“一”端实体的变量及getter,setter方法。   比如说多个学生对应一个班级,在学生实体类加入:private Grade grade;   2、“多”端配置文件,student.hbm.xml里的标签设置:<many-to-one name="grade" column="gradeId" ></many-to-one> 二、Hibernate单向的一对一主键关联映射:就是让两个实体的主键一样,就不需要加入多余的字段了。   比如一个学生对应一个身份证号,一个学生对应一条户口信息等等,都是一对一关联映射。      1、Person实体里要持有IdCard的引用。在Person实体里加入属性:Private IdCard idCard;   2、Person端维护关系,所以需要重点看Person的配置文件,Person.hbm.xml通俗来讲 ,就是就是Person中的Id既为主键又为外键。   所以需要修改Person中的id标签:通俗来讲是告诉Person里的id去关联哪个实体里的id。 此处的 foreign生成策略,会取得关联对象的标识, property标签内是关联 此处的

JPA之常用 基本注解

荒凉一梦 提交于 2020-03-19 11:22:13
3 月,跳不动了?>>> JPA之常用 基本注解 1、常用基本注解 @Entity @Table @Basic @Column @GeneratedValue @Id 2、特殊注解 @Transient @Temporal 用 table 来生成主键 3、常用注解的使用 1、 @Entity 标注用于实体类声明语句之前,指出该Java 类为实体类,将映射到指定的数据库表。如声明一个实体类 Customer,它将映射到数据库中的 customer 表上。 2、 @Table 当实体类与其映射的数据库表名不同名时需要使用 @Table 标注说明,该标注与 @Entity 标注并列使用,置于实体类声明语句之前,可写于单独语句行,也可与声明语句同行。 @Table 标注的常用选项是 name,用于指明数据库的表名 @Table标注还有一个两个选项 catalog 和 schema 用于设置表所属的数据库目录或模式,通常为数据库名。 uniqueConstraints 选项用于设置约束条件,通常不须设置。如下代码: @Table(name= " JPA_CUSTOMERS " ) // 主要是映射表名对应的数据库表名JPA_CUSTOMER默认情况下可以不写表名与持久化类名相同 @Entity // 表明这是一个持久化类 public class Customer { 3、 @Id @Id

《MySQL必知必会》读书笔记_3

烈酒焚心 提交于 2020-03-19 02:47:11
PS:这次的信息量有点大。 聚集不同值 SELECT AVG(DISTINCT prod_price) AS avg_price FROM products WHERE vend_id = 1003 # 相同的值不会被计算 组合聚集函数 SELECT COUNT(*) AS num_items, MIN(prod_price) AS price_min, MAX(prod_price) AS price_max, AVG(prod_price) AS price_avg FROM products 创建分组 # 不创建分组的样子 SELECT vend_id FROM products # 创建分组的样子 SELECT vend_id,COUNT(*) AS num_prods FROM products GROUP BY vend_id P84~P96 主键:唯一标识 外键:某个表的主键值,包含在另一个表中的一列,定义了两个表之间的关系。 PS :外键约束,会导致如果删除表 A 中的一行数据,如果表 A 的主键为表 B 的外键的话,并且表 B 中有数据引用外键为删除数据,那么会删除失败。需要先接触约束,删除表 B 中的数据,才能删除表 A 中的数据。 PS :需要学习数据库范式的概念,才能更加了解书中所说的设计方式。 联结是一种机制,用来在一条 SELECT 语句中关联表

数据库 MySQL 之 数据操作

旧街凉风 提交于 2020-03-14 03:17:43
一、MySQL数据类型介绍 MySQL支持多种类型,大致可以分为四类:数值、字符串类型、日期/时间和其他类型。 ①二进制类型 bit[(M)] 二进制位(101001),m表示二进制位的长度(1-64),默认m=1 ②整数类型:存储年龄,等级,id,各种号码等 tinyint[(m)] [unsigned] [zerofill] 小整数,数据类型用于保存一些范围的整数数值范围: 有符号:-128 ~ 127. 无符号:255 特别的: MySQL中无布尔值,使用tinyint(1)构造。 int[(m)][unsigned][zerofill] 整数,数据类型用于保存一些范围的整数数值范围: 有符号: -2147483648 ~ 2147483647 无符号:4294967295 bigint[(m)][unsigned][zerofill] 大整数,数据类型用于保存一些范围的整数数值范围: 有符号:-9223372036854775808 ~ 9223372036854775807 无符号:18446744073709551615 注意:为该类型指定宽度时,仅仅只是指定查询结果的显示宽度,与存储范围无关,所以我们使用默认的就可以了,有符号和无符号的最大数字需要的显示宽度均为10,而针对有符号的最小值则需要11位才能显示完全,所以int类型默认的显示宽度为11是非常合理的 ③小数型

数据库表结构设计方法及原则

偶尔善良 提交于 2020-03-12 15:27:33
http://www.cnblogs.com/RunForLove/p/5693986.html 数据库设计的三大范式:为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。范式是符合某一种设计要求的总结。要想设计一个结构合理的关系型数据库,必须满足一定的范式。   在实际开发中最为常见的设计范式有三个:第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式;第二范式在第一范式的基础之上更进一层。第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中;第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。总结一下,就是: 第一范式(确保每列保持原子性); 第二范式(确保表中的每列都和主键相关); 第三范式(确保每列都和主键列直接相关,而不是间接相关)。   在目前的企业信息系统中,数据库还是最佳的数据存储方式,虽然已经有很多的书籍在指导我们进行数据库设计,但应该那种方式是设计数据库的表结构的最好方法、设计时应遵从什么样的原则、四个范式如何能够用一种方式达到顺畅的应用等是我一直在思考和总结的问题