唯一索引

SQL索引见解

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

my39_InnoDB锁机制之Gap Lock、Next-Key Lock、Record Lock解析

自古美人都是妖i 提交于 2020-01-26 21:22:16
MySQL InnoDB支持三种行锁定方式: 行锁(Record Lock):锁直接加在索引记录上面,锁住的是key。 间隙锁(Gap Lock): 锁定索引记录间隙,确保索引记录的间隙不变。间隙锁是针对事务隔离级别为可重复读或以上级别而已的。 Next-Key Lock :行锁和间隙锁组合起来就叫Next-Key Lock。 默认情况下,InnoDB工作在可重复读隔离级别下,并且会以Next-Key Lock的方式对数据行进行加锁,这样可以有效防止幻读的发生。 Next-Key Lock是行锁和间隙锁的组合,当InnoDB扫描索引记录的时候,会首先对索引记录加上行锁(Record Lock),再对索引记录两 边的间隙加上间隙锁(Gap Lock)。加上间隙锁之后,其他事务就不能在这个间隙修改或者插入记录。 Gap Lock在InnoDB的唯一作用就是防止其他事务的插入操作,以此防止幻读的发生。 行锁(Record Lock) 行锁锁定的是索引记录,而不是行数据,也就是说锁定的是key。 间隙锁(Gap Lock) 例如: create table test(id int,v1 int,v2 int,primary key(id),key `idx_v1`(`v1`))Engine=InnoDB DEFAULT CHARSET=UTF8; insert into test

深入了解mysql--gap locks,Next-Key Locks

时光毁灭记忆、已成空白 提交于 2020-01-25 22:47:42
Next-Key Locks Next-Key Locks是在存储引擎innodb、事务级别在 可重复读 的情况下使用的数据库锁,官网上有介绍,Next-Key Locks是行锁和gap锁的组合。行锁是什么我们都很清楚,这篇文章主要简单分析一下mysql中的gap锁是什么。innodb默认的锁就是Next-Key locks。 GAP锁 gap锁,又称为间隙锁。存在的主要目的就是为了防止在 可重复读 的事务级别下,出现幻读问题。 在可重复读的事务级别下面,普通的select读的是快照,不存在幻读情况,但是如果加上for update的话,读取是已提交事务数据,gap锁保证for update情况下,不出现幻读。 那么gap锁到底是如何加锁的呢? 假如是for update级别操作,先看看几条总结的何时加锁的规则。 唯一索引 精确等值检索,Next-Key Locks就退化为记录锁,不会加gap锁 范围检索,会锁住where条件中相应的范围,范围中的记录以及间隙,换言之就是加上记录锁和gap 锁(至于区间是多大稍后讨论)。 不走索引检索,全表间隙加gap锁、全表记录加记录锁 非唯一索引 精确等值检索,Next-Key Locks会对间隙加gap锁(至于区间是多大稍后讨论),以及对应检索到的记录加记录锁。 范围检索,会锁住where条件中相应的范围,范围中的记录以及间隙

MongoDB索引

时光怂恿深爱的人放手 提交于 2020-01-15 02:01:29
索引是特殊的数据结构,它以易于遍历的形式存储部分集合数据集。索引存储特定字段或字段集的值,按字段值排序。 MongoDB的索引几乎与传统的关系型数据库索引一模一样,它的主键 _id 也是一个索引,MongoDB的数据按照 _id 的顺序存储在内存页与磁盘块上。但是, _id 与业务毫无关联,在业务相关的条件查询时,还是需要进行全表扫描才能找到对应页,效率并不高。 为了避免性能瓶颈,可以根据常用的查询建立索引 索引的值是按照一定的顺序排列的,使用索引键对文档进行排序效率非常高,只需要按照索引读取数据即可。 不过,使用索引也是有代价的,不仅会增加磁盘与内存的消耗,对于添加的每一个索引,每次写操作(插入、更新、删除)都会耗费更多时间,这是因为,数据发生变动时,还需要额外的开销更新索引。 文章目录 聚簇索引与非聚簇索引 MongoDB索引分类 主键索引 单字段索引 复合索引 复合索引与排序共用 唯一索引 复合唯一索引 去除重复 稀疏索引 TTL索引 全文索引 地理空间索引 索引优化 查询优化 写操作优化 聚簇索引与非聚簇索引 磁盘上的数据某一时刻只能有一种排序方式,而聚簇索引的特点是:索引顺序与数据存储顺序一致,所以聚簇索引只能有一个。 《数据库原理》中对聚簇索引的定义:聚簇索引的叶子节点是数据节点,非聚簇索引的叶子节点仍然是索引节点,只不过有指向对应数据块的指针。

MySQL 索引详解

有些话、适合烂在心里 提交于 2020-01-14 03:15:42
索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。 注: [1] 索引不是万能的 ! 索引可以加快数据检索操作,但会使数据修改操作变慢。每修改数据记录,索引就必须刷新一次。为了在某种程序上弥补这一缺陷,许多SQL命令都有一个DELAY_KEY_WRITE项。这个选项的作用是暂时制止MySQL在该命令每插入一条新记录和每修改一条现有之后立刻对索引进行刷新,对索引的刷新将等到全部记录插入/修改完毕之后再进行。在需要把许多新记录插入某个数据表的场合,DELAY_KEY_WRITE选项的作用将非常明显。 [2]另外, 索引还会在硬盘上占用相当大的空间 。 因此应该只为最经常查询和最经常排序的数据列建立索引。注意,如果某个数据列包含许多重复的内容,为它建立索引就没有太大的实际效果。 从理论上讲,完全可以为数据表里的每个字段分别建一个索引,但MySQL把同一个数据表里的索引总数限制为16个。 1. InnoDB数据表的索引 与MyISAM数据表相比,索引对InnoDB数据的重要性要大得多。在InnoDB数据表上,索引对InnoDB数据表的重要性要在得多。在 InnoDB数据表上,索引不仅会在搜索数据记录时发挥作用,还是数据行级锁定机制的苊、基础。”数据行级锁定”的意思是指在事务操作的执行过程中锁定正在被处理的个别记录

唯一键约束--查看索引

青春壹個敷衍的年華 提交于 2020-01-12 22:06:20
唯一键约束 (一)概述 1、关键字:unique key 2、特点:指定了唯一键的列的值必须唯一,不能重复 3、作用:给主键以外的列,限定唯一性 4、唯一键分类 单列的唯一 复合唯一 唯一键和主键的区别: (1)主键不能为空,唯一键可以为空 (2)主键约束,一个表只能有一个,而唯一键可以有很多个 (二)使用唯一键 1、如何创建/指定唯一键 (1)在建表时 create table 【数据库名.】表名称( 字段1 数据类型 primary key, 字段2 数据类型 【unique key】, 字段3 数据类型 【unique key】, … ); 或 create table 【数据库名.】表名称( 字段1 数据类型 primary key, 字段2 数据类型 , 字段3 数据类型 , …, unique key(字段2), #分别唯一 unique key(字段3) ); create table 【数据库名.】表名称( 字段1 数据类型 primary key, 字段2 数据类型 , 字段3 数据类型 , …, unique key(字段列表) #复合唯一 ); create table emp( eid int primary key, #员工编号 ename varchar(20), #姓名 cardid varchar(18) unique key, #身份证号 tel

基于oracle的sql优化

↘锁芯ラ 提交于 2020-01-10 13:53:45
基于oracle的sql优化 基于oracle的sql优化 一.编写初衷描述 在应有系统开发初期,由于数据库数据较少,对于sql语句各种写法的编写体现不出sql的性能优劣,随着数据的不断增加,出现海量数据,劣质sql与优质sql在执行效率甚至存在百倍差距,可见sql优化的重要性 二.Sql语句性能优化 2.1 认识Oracle的执行过程 2.2 Oracle优化法则—漏斗法则 2.3 Oracle 执行计划 2.3.1 什么是Oracle执行计划 执行计划是一条查询语句在Oracle中执行过程或者访问路径的描述. 2.3.2 查看Oracle执行计划 1.执行计划常用的列字段解释 基数:返回的结果集行数 字节:执行该步骤后返回的字节数 耗费(cust),CPU耗费:Oracle估计的该步骤的执行成本,用于说明SQL执行的代价,理论上越小越好. 2.3.3 看懂Oracle执行计划 2.3.3.1执行顺序 根据缩进来判断,缩进最多的最先执行(缩进相同时,最上面的最先执行) 2.4 表的访问方式 TABLE ACCESS FULL ( 全表扫描 ) TABLE ACCESS BY ROWID ( 通过rowid的表存取 ) TABLE ACCESS BY INDEX SCAN ( 索引扫描 ) 2.4.1 ABLE ACCESS FULL(全表扫描) Oracle会读取表中的所有行

Mysql唯一索引线上故障记录

六月ゝ 毕业季﹏ 提交于 2020-01-07 16:29:38
问题现象: Mysql插入一条数据时,未指定自增键的值却报错:自增键重复,无法插入! 执行SQL INSERT INTO `test`.`test_sort`(`id`, `name`, `age`, `birthday`) VALUES (10027, '测试', 23, '2020-01-07 12:23:11') 报错: INSERT INTO `test`.`test_sort`(`id`, `name`, `age`, `birthday`) VALUES (10027, '测试', 23, '2020-01-07 12:23:11') > 1062 - Duplicate entry '38' for key 'sort' > 时间: 0.001s 表的创建语句: CREATE TABLE `test_sort` ( `id` int(11) NOT NULL COMMENT '主键', `name` varchar(24) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '姓名', `age` tinyint(3) UNSIGNED NULL DEFAULT NULL COMMENT '年龄', `birthday` datetime(0) NULL DEFAULT

MySQL索引与事务详解

落花浮王杯 提交于 2020-01-07 11:32:21
MySQL索引与事务详解 一、前言 ​ 上一章我们讲解了MySQL的手工编译安装流程以及相关的数据库操作命令(sql语句),本文将要详细介绍MySQL索引与事务的概念及原理,并初步了解MySQL数据库视图概念,简述数据库的存储过程。 二、索引 2.1索引的概念——什么是索引? ​ 一般来说,一篇论文,或者说一本书,都有其目录,而目录一般是所有章节的概述,或者说是要点核心,而索引的概念其实也与之类似。 ​ 索引,顾名思义,就是一个方便用户搜索所需资源的引导,只不过在数据库中,索引一般被认为是一种特殊的文件,尤其在Linux系统中("一切皆文件")。从专业术语上解释其含义就是“代表记录的引用指针”。 2.2索引的作用 加快查询速度,提高工作效率; 降低i/o成本,提供基础排序; 加快多表之间的连接; 支持唯一性索引(下面会介绍什么是唯一性索引),保证数据表中数据的唯一性性; 2.3索引的分类 2.3.1普通索引 ​ 就是一般的索引,只是为了区别于其他特殊索引的一个统称 2.3.2唯一性索引 ​ 与普通索引基本类同,区别在于,唯一性索引的列中的所有值都不相同,即“唯一”。 ​ 简单举例来说,学生数据表,年龄可以是普通索引,但不可以是唯一性索引,但是详细住址可以是。 2.3.3主键索引 ​ 本质上也是一种唯一性索引,但必须指定为“primary key”,该索引要求主键中的每个值都唯一

主键和唯一索引的区别

不打扰是莪最后的温柔 提交于 2020-01-07 08:26:47
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 主键是一种约束,唯一索引是一种索引,两者在本质上是不同的。 主键索引: 数据库表经常有一列或列组合,其值唯一标识表中的每一行。该列称为表的主键。 在数据库关系图中为表定义主键将自动创建主键索引,主键索引是唯一索引的特定类型。 该索引要求主键中的每个值都唯一, 字段里面的值不能为空 。当在查询中使用主键索引时,它还允许对数据的快速访问。 主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键。 唯一性索引列允许空值,而主键列不允许为空值。 主键列在创建时,已经默认为空值 + 唯一索引了。 主键可以被其他表引用为外键,而唯一索引不能。 一个表最多只能创建一个主键,但可以创建多个唯一索引。 主键更适合那些不容易更改的唯一标识,如自动递增列、身份证号等。 在 RBO 模式下,主键的执行计划优先级要高于唯一索引。 两者可以提高查询的速度。 -- 创建一张仅包含主键和唯一索引的表 CREATE TABLE test (PrimaryKey VARCHAR2(20), UniqueKey VARCHAR2(20) ); -- 分别创建主键和唯一索引,语法不同 ALTER TABLE test ADD CONSTRAINT test_PrimaryKey PRIMARY KEY (PrimaryKey); CREATE