数据库主键

聚集索引和非聚集索引

江枫思渺然 提交于 2020-02-02 02:22:06
SQL SERVER 提供了两种索引 聚集索引:聚集索引表示表中存储的数据按照索引的顺序存储,检索效率比非聚集索引高,但对数据更新影响较大; 非聚集索引:非聚集索引表示数据存储在一个地方,索引存储在另一个地方,索引带有指针指向数据的存储位置,非聚集索引检索效率比聚集索引低,但对数据更新影响较小。 聚集索引   该索引中键值的逻辑顺序决定了表中相应行的物理顺序。聚集索引类似于电话簿,后者按姓氏排列数据。由于聚集索引规定数据在表中的物理存储顺序,因此一个表只能包含一个聚集索引。但该索引可以包含多个列(组合索引),就像电话簿按姓氏和名字进行组织一样。 1)聚集索引使用注意事项 定义聚集索引键时使用的列越少越好。 包含大量非重复值的列; 使用下列运算符返回一个范围值的查询:BETWEEN、>、>=、< 和 <=; 被连续访问的列; 回大型结果集的查询; 经常被使用联接或 GROUP BY 子句的查询访问的列;一般来说,这些是外键列。对 ORDER BY 或 GROUP BY 子句中指定的列进行索引,可以使 SQL Server 不必对数据进行排序,因为这些行已经排序。这样可以提高查询性能; OLTP 类型的应用程序,这些程序要求进行非常快速的单行查找(一般通过主键)。应在主键上创建聚集索引。 2)聚集索引不适用于 频繁更改的列 。这将导致整行移动(因为 SQL Server

Sql索引

两盒软妹~` 提交于 2020-02-02 00:47:41
1.为什么要给表加上主键? 建表的时候都会为表加上主键, 在某些关系数据库中, 如果建表时不指定主键,数据库会拒绝建表的语句执行。 一个没加主键的表,并不能被称之为「表」。一个没加主键的表,它的数据无序的放置在磁盘存储器上,一行一行的排列的很整齐, 跟我认知中的「表」很接近。 如果给表上了主键,那么表在磁盘上的存储结构就由整齐排列的结构转变成了树状结构,也就是上面说的「平衡树」结构,换句话说,就是整个表就变成了一个索引。没错, 再说一遍, 整个表变成了一个索引,也就是所谓的「聚集索引」。 这就是为什么一个表只能有一个主键, 一个表只能有一个「聚集索引」,因为主键的作用就是把「表」的数据格式转换成「索引(平衡树)」的格式放置。 假如我们执行一个SQL语句: select * from table where id = 1256; 首先根据索引定位到1256这个值所在的叶结点,然后再通过叶结点取到id等于1256的数据行。 2.为什么加索引后会使查询变快? 平衡树结构(一棵非常茂盛和节点非常多的树),假设这棵树有10层,那么只需要10次IO开销就能查找到所需要的数据, 速度以指数级别提升,用大O标记法就是O(log n),n是记录总树,底数是树的分叉数,结果就是树的层次数。 3.为什么加索引后会使写入、修改、删除变慢? 索引能让数据库查询数据的速度上升, 而使写入数据的速度下降

数据库三范式

放肆的年华 提交于 2020-02-01 10:20:01
ps:数据库三范式是层层递进的关系 一.数据库第一范式,数据列的原子性,即每一个数据列都应该具有唯一性,场景(1.电话--》如果需求是要公司电话和家庭电话则不符合标准.。 2.物品名称1,物品名称2--》数据列意义重复,应该变为物品名称) 二.数据库第二范式,每一个数据列都应该依赖于主键而存在,(oderid,productid,quntity,productname(1,2联合主键)--》第3列依赖于主键,但第4列只依赖于第2列,所以不符合,所以应该分成两张表(oderid,productid,quntity)(productid,productname)) 三.数据库第三范式,不能存在传递依赖的情况,(oderid,productid,productname(1为主键)--》第3列直接依赖于第2列,间接依赖于主键,虽然符合第二范式,但注意,这里的依赖是间接的! 来源: CSDN 作者: houxinhong 链接: https://blog.csdn.net/houxinhong/article/details/104129110

[Mysql] 索引详解

此生再无相见时 提交于 2020-02-01 10:05:09
前言: 今天在这里总结一下Mysql索引,也给自己加个印象。 我的座右铭:即使记性再差,仍要坚持多读多看。 概念 Mysql索引的建立对于Mysql的高效运行是很重要的,索引可以大大提高Mysql的检索速度。 Mysql目前主要有以下5中索引类型: 普通索引 唯一索引 主键索引 组合索引 全文索引 缺点: 索引也有它的缺点,过多的滥用索引,也会降低更新表的速度。如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。建立索引会占用磁盘空间的索引文件。 5种索引类型 普通索引 这是最基本的索引,他没有任何限制。可以用如下方式创建: 直接创建索引 create index index_name on table ( column ( length ) ) 修改表结构的方式添加索引: alter table table_name add index index_name on ( column ( length ) ) 创建表的时候同时创建索引 CREATE TABLE ` table ` ( ` id ` int ( 11 ) NOT NULL AUTO_INCREMENT , ` title ` char ( 255 ) CHARACTER NOT NULL , ` content ` text CHARACTER NULL

python之ORM的应用

我们两清 提交于 2020-02-01 05:16:06
''' ORM 对象关系映射 --->映射到数据表的一条条记录 类名 ---> 表名 对象 ---> 一条记录 对象.属性 ---> 字段 ''' from day38 . mysql_control import MySQL # 1.创建字段的类型 对应数据表中一个个字段的创建规范 class Field : #父类 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 class StringField ( Field ) : #varchar def __init__ ( self , name , column_type = 'varchar(64)' , primary_key = False , default = None ) : super ( ) . __init__ ( name , column_type , primary_key , default ) #继承父类 class IntegerField ( Field ) : #int def __init_

你在家快疯了?20 道数据库面试解析学起来

人走茶凉 提交于 2020-01-30 15:49:37
面试的时候,发现数据库方面,忘得一塌糊涂,抽时间整理了一些数据库方面的题。 事务四大特性(ACID)原子性、一致性、隔离性、持久性? 事务的并发?事务隔离级别,每个级别会引发什么问题,MySQL 默认是哪个级别? MySQL 常见的三种存储引擎(InnoDB、MyISAM、MEMORY)的区别? MySQL 的 MyISAM 与 InnoDB 两种存储引擎在,事务、锁级别,各自的适用场景? 查询语句不同元素(where、jion、limit、group by、having 等等)执行先后顺序? 什么是临时表,临时表什么时候删除? MySQL B+Tree 索引和 Hash 索引的区别? 聚集索引和非聚集索引区别? 有哪些锁(乐观锁悲观锁),select 时怎么加排它锁? 非关系型数据库和关系型数据库区别,优势比较? 数据库三范式,根据某个场景设计数据表? 数据库的读写分离、主从复制,主从复制分析的 7 个问题? 使用 explain 优化 sql 和索引? MySQL 慢查询怎么解决? 什么是 内连接、外连接、交叉连接、笛卡尔积等? mysql 都有什么锁,死锁判定原理和具体场景,死锁怎么解决? varchar 和 char 的使用场景? mysql 高并发环境解决方案? 数据库崩溃时事务的恢复机制(REDO 日志和 UNDO 日志)? 事务四大特性(ACID)原子性、一致性

mysql innodb存储引擎和myisam引擎

喜欢而已 提交于 2020-01-30 07:09:35
InnoDb存储引擎面向在线事务处理,其特点是行锁设计、支持外键、并支持Oricle似得非锁定读(所谓非锁定读是如果数据库实例读取的行正在进行更新或删除操作当前读取不会等待当前锁的释放而是读取当前行的快照)InnoDb引擎的表保存在以ibd的文件中,innodb通过使用多版本并发控制来获得高并发性,Innodb采用了聚集的方式即每张表的存储都按主键的顺序存放,如果没有显示的指定主键Innodb存储引擎会为每一行生成一个6字节的rowid并以此作为主键 Myisam存储引擎不支持事务,表锁,支持全文索引 myisam存储引擎的数据表有myd和myi组成myd用来存放数据,myi用来存放索引文件 来源: https://www.cnblogs.com/paulversion/p/5535657.html

SQL索引见解

纵然是瞬间 提交于 2020-01-30 06:27:32
其实对于非专业的数据库操作人员来讲,例如软件开发人员,在很大程度上都搞不清楚数据库索引的一些基本知识,有些是知其一不知其二,或者是知其然不知其所以然。造成这种情况的主要原因我觉的是行业原因,有很多公司都有自己的DBA团队,他们会帮助你优化SQL,开发人员即使不懂优化问题也不大,所以开发人员对这方面也就不会下太多功夫去了解SQL优化,但如果公司没有这样的DBA呢,就只能靠程序员自己了。 最近突然想起前一阵和一朋友的聊天,当时他问我的问题是一个非常普通的问题:说说SQL聚集索引和非聚集索引的区别。 大家可能认为这个问题难度不大,认为太熟悉了,也许不会感兴趣,但你真能说清楚吗?其实要想说明白这两者的差别也不是三两句就说的清的,那天我也是觉的这问题太泛了,就随便说了其中的两个区别: 聚集索引一个表只能有一个,而非聚集索引一个表可以存在多个,这个跟没问题没差别,一般人都知道。 聚集索引存储记录是物理上连续存在,而非聚集索引是逻辑上的连续,物理存储并不连续,这个大家也都知道。 上面的两点从大的方面讲都是讲的通的,后面我们继续探讨,举一个实际点的例子,一个学生表student,里面是学生号id,学生姓名,学生所在城市ID,学生成绩(总分)。 问:如果想按姓名查询,如何做优化? 答:在姓名字段上建立索引。 问:建立什么类型的索引? 答:建立非聚集索引。 问:为什么? 答:一般有范围查询的需求

Hibernate主键生成策略

一世执手 提交于 2020-01-30 04:36:06
主键生成策略 1.idenitty:指定使用数据库里面的ID自增长策略 2.sequence:使用序列的实现ID生成策略,主要用于有序列的数据库。 如:Oracle,DB2,如果不支持序列的数据库(如:MYSQL),该策略会使用一个表模拟序列 3. native:使用数据库本地的策略,就是数据库里面使用怎么样的策略就用什么策略,HIbernate不做任何的判断 4. uuid:就是数据库的主键是使用一个唯一的字符串的来存储.这个唯一的字符串就是UUID主键必须为String类型。 5. assigned:assigned策略,就是不使用主键生成策略,由手工输入ID. @GeneratedValue ( strategy = GenerationType . IDENTITY ) public int getId ( ) { return id ; } 来源: CSDN 作者: OVO_LQ_Start 链接: https://blog.csdn.net/OVO_LQ_Start/article/details/104106334

TkMybatis 笔记

落花浮王杯 提交于 2020-01-28 22:30:09
目录 1.基本步骤 2.Java 实体类 3.集成Mapper 4.Mapper继承tkMabatis的Mapper接口 5.启动类Application或自定义Mybatis配置类上使用@MapperScan注解扫描Mapper接口 6.application.properties配置mapper.xml配置文件的扫描路径 7.常用注解 8.常用方法 1.基本步骤 1. 引入TkMybatis的Maven依赖 2. 实体类的相关配置,@Id,@Table 3. Mapper继承tkMabatis的Mapper接口 4. 启动类Application或自定义Mybatis配置类上使用@MapperScan注解扫描Mapper接口 5. 在application.properties配置文件中,配置mapper.xml文件指定的位置[可选] 6. 使用TkMybatis提供的sql执行方法 7. 如有需要,实现mapper.xml自定义sql语句 PS : 1. TkMybatis默认使用继承Mapper接口中传入的实体类对象去数据库寻找对应的表,因此如果表名与实体类名不满足对应规则时,会报错,这时使用@Table为实体类指定表。(这种对应规则为驼峰命名规则) 2. 使用TkMybatis可以无xml文件实现数据库操作,只需要继承tkMybatis的Mapper接口即可。 3.