唯一索引

mysql InnoDB加锁分析

一笑奈何 提交于 2019-11-29 08:12:52
文章转载自: http://www.fanyilun.me/2017/04/20/MySQL%E5%8A%A0%E9%94%81%E5%88%86%E6%9E%90/ 以下实验数据基于MySQL 5.7。 假设已知一张表my_table,id列为主键 id name num 1 aaa 100 5 bbb 200 8 bbb 300 10 ccc 400 1. 查询命中聚簇索引(主键索引) 1.1 如果是精确查询,那么会在命中的索引上加record lock // 在id=1的聚簇索引上加X锁 update my_table set name='a' where id=1; // 在id=1的聚簇索引上加S锁 select * from my_table where id=1 lock in share mode; 1.2 如果是范围查询,那么 1.2.1 在RC隔离级别下,会在所有命中的行的聚簇索引上加record locks(只锁行) // 在id=8和10的聚簇索引上加X锁 update my_table set name='a' where id>7; // 在id=1的聚簇索引上加X锁 update my_table set name='a' where id<=1; 1.2.2 在RR隔离级别下,会在所有命中的行的聚簇索引上加next-key locks(锁住行和间隙)

数据库主键和索引关联

空扰寡人 提交于 2019-11-29 03:30:14
一直以来不能够分清主键和索引的关系,在此梳理以备不时之需 1、主键   主键就是能够唯一标识表中某一行的属性或属性组,一个表只能有一个主键,但可以有多个候选索引。   主键主要作用:1、惟一地标识一行。 2、作为一个可以被外键有效引用的对象。 2、索引   包含着对数据表里所有记录的引用指针。 区别:    一个表中可以有多个唯一性索引,但只能有一个主键。   主键列不允许空值,而唯一性索引列允许空值。    主键一定是唯一性索引,唯一性索引并不一定就是主键。 联系:   主键是为了标识数据库记录唯一性,不允许记录重复,且键值不能为空,主键也是一个特殊索引。   其实主键和索引都是键,不过主键是逻辑键,索引是物理键,意思就是主键不实际存在,而索引实际存在在数据库中,主键一般都要建,主要是用来避免一张表中有相同的记录,索引一般可以不建,但如果需要对该表进行查询操作,则最好建,这样可以加快检索的速度。 注:通俗的说主键是一本书的页码,索引是一本书的目录。 参考: https://www.cnblogs.com/ybygb-geng/p/9574169.html 来源: https://www.cnblogs.com/51python/p/11443540.html

记mysql一次莫名的1062错误

孤街浪徒 提交于 2019-11-28 14:44:50
1062 Duplicate entry '...' for key 'PRIMARY指的是主键重复或者唯一索引重复。 本来mysql表中未设主键和唯一索引,准备加上,但是设置的时候总是提示1062,提示的数据我看了,只有一行,并没有重复。 开始疯狂百度、谷歌,有说主从插入重复的,我直接把从数据库删了,依然报错、崩溃!!! 最后发现问题所在,把存储引擎由MyISAM 改成InnoDB,虽然依然有提示1062,但是提示的数据都是重复的, 也就是说当存储引擎是MyISAM 时,设置主键或者唯一索引时,如果有重复数据会提示1062但是提示的数据是最新一条的数据(错误的,没办法判断到底哪条有重复),当存储引擎是InnoDB时会提示正确的重复的那条数据。 来源: https://www.cnblogs.com/lwx521/p/11410377.html

索引,约束

邮差的信 提交于 2019-11-28 14:05:39
摘自MSDN:“ CREATE INDEX (Transact-SQL) ” 为指定表或视图创建关系索引,或为指定表创建 XML 索引。可在向表中填入数据前创建索引。可通过指定限定的数据库名称,为另一个数据库中的表或视图创建索引。 create index indexName on tableName(colName) with (options) 这样创建的为 non unique ,nonclustered 索引 UNIQUE :为表或视图创建唯一索引。 唯一索引不允许两行具有相同的索引键值 。视图的聚集索引必须唯一。 默认为non unique CLUSTERED:创建索引时,键值的逻辑顺序决定表中对应行的物理顺序。聚集索引的底层(或称叶级别)包含该表的实际数据行。 一个表或视图只允许同时有一个聚集索引 。有关详细信息,请参阅聚集索引结构。 如果没有指定 CLUSTERED,则创建非聚集索引。 NONCLUSTERED :创建一个指定表的逻辑排序的索引。 对于非聚集索引,数据行的物理排序独立于索引排序。 有关详细信息,请参阅非聚集索引结构。 无论是使用 PRIMARY KEY 和 UNIQUE 约束隐式创建索引,还是使用 CREATE INDEX 显式创建索引。 每个表都最多可包含 249 个非聚集索引 。 对于索引视图,只能为已定义唯一聚集索引的视图创建非聚集索引。

MySQL外键+唯一索引

痴心易碎 提交于 2019-11-28 12:32:47
MySQL外键+唯一索引 2019-08-22 1.外键 是指一个表里的列与另一张表里的列进行关系连接,可用于使用简单的数字或字母替代复杂的数据结构,不仅可以节省空间,也拥有约束功能,可减少书写出错的机会。 1.1使用方式 constraint 变量名 foreign key (列名) references 表名2(列名2); 其中变量名是自己给定的,约定不可以有重复; 列名即需要连接外键的列; 表名2值指的是外键的表; 列名2是和表中连接对应的列; 1.2实例 例如下面两个表,表1是机器状态表,表2是机器信息表;将机器的四个状态通过1,2,3,4这4个值表示出来: create table machinestatus( status_id int auto_increment primary key, status_name char(20) )engine=innodb default charset=utf8; insert into machinestatus(status_name) values("待机"),("运行"),("故障"),("关机"); create table machineinfo( id int auto_increment primary key, identifier int not null, status int, constraint fk

MySQL-InnoDB锁(二)

为君一笑 提交于 2019-11-28 11:01:44
上篇文章中对InnoDB存储引擎中的锁进行学习,本文是实践部分,根据索引和查询范围,探究加锁范围的情况。 在本实例中,创建简单表如下: mysql> select * from t; +------+ | id | +------+ | 1 | | 3 | | 5 | | 9 | | 11 | +------+ 测试结果 根据唯一索引、非唯一索引和无索引,以及数据库中是否存在查询边界,进行测试。结果如下,其中边界5存在索引中,边界6不在。 结论 : 1. 凡是涉及范围锁,都会在行记录上加 Next-Key Lock(X和GAP锁) 。 2. 小于时 ,唯一索引和非唯一索引 加锁最大范围 ,都是 索引中最接近边界的下一个索引,并且包含该索引(Next-Key) ,如索引5,和离边界6最近的索引9;    如果边界值超过索引中最大值,则锁定包含该边界值的所有范围。 3. 大于时 ,唯一索引和非唯一索引 加锁最小范围 ,都是 索引中最接近边界的前一个索引,但不包含该索引 ,如索引5,和离6最近的索引5;    如果插入的值超过索引中最大值,锁类型变为X锁,被锁的最大行为supremum pseudo-record,它是索引中的伪记录,表示索引中可能存在的最大值。此时,锁的范围扩大到正无穷。 4. 等于时 ,   ① 唯一索引,在索引中存在该值, 锁由Next-Key

SQLSERVER SQL性能优化

一世执手 提交于 2019-11-28 06:32:30
1.选择最有效率的表名顺序(只在基于规则的优化器中有效)      SQLSERVER 的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表driving table)将被最先处理,在FROM子句中包含多个表的情况下,必须选择记录条数最少的表作为基础表,当 SQLSERVER 处理多个表时,会运用排序及合并的方式连接它们,    首先,扫描第一个表(FROM子句中最后的那个表)并对记录进行排序;然后扫描第二个表(FROM子句中最后第二个表);最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并    例如: 表 TAB1 16,384 条记录表 TAB2 5 条记录,选择TAB2作为基础表 (最好的方法) select count(*) from tab1,tab2 执行时间0.96秒,选择TAB2作为基础表 (不佳的方法) select count(*) from tab2,tab1 执行时间26.09秒; 如果有3个以上的表连接查询,那就需要选择交叉表(intersection table)作为基础表,交叉表是指那个被其他表所引用的表      例如:    EMP表描述了LOCATION表和CATEGORY表的交集    SELECT *    FROM LOCATION L,    CATEGORY C,    EMP E  

kingbase7获取唯一索引和子分区键的view

大兔子大兔子 提交于 2019-11-28 04:17:14
--构造表 CREATE TABLE ZYJ.TEST(ID INT PRIMARY KEY,NAME VARCHAR(200),ADDR VARCHAR(200),TEL VARCHAR(11)); ALTER TABLE ZYJ.TEST ADD COLUMN VARCHAR1 VARCHAR(200); ALTER TABLE ZYJ.TEST ADD COLUMN VARCHAR2 VARCHAR(200); ALTER TABLE ZYJ.TEST ADD COLUMN VARCHAR3 VARCHAR(200); CREATE INDEX IDX_ADDR ON ZYJ.TEST(ADDR); CREATE UNIQUE INDEX IDX_TEL ON ZYJ.TEST(TEL); CREATE UNIQUE INDEX IDXU_VARCHAR123 ON ZYJ.TEST(VARCHAR1,VARCHAR2,VARCHAR3); --构造系统视图结构 CREATE TABLE ZYJ.SYS_ATTRIBUTE AS SELECT * FROM SYS_ATTRIBUTE ATTR WHERE ATTR.ATTRELID=16493; CREATE TABLE ZYJ.SYS_INDEX AS SELECT * FROM SYS_INDEX INDEX WHERE

普通索引唯一索引的区别

生来就可爱ヽ(ⅴ<●) 提交于 2019-11-28 04:15:35
1、查询:   唯一索引查到满足条件的数据后直接返回   普通索引查到满足条件的数据后会继续匹配下一行是否满足条件   影响:会将数据按页加载到内存中,多匹配一行的开销不大 除非刚好匹配的当前页的最后一条数据,需要继续从磁盘加载下一页 2、写   唯一索引:需要判断是否重复,需要将对应的页从磁盘加载的内存中   普通索引:普通索引使用change buffer(占用buffer pool的空间),直接将更新写入到buffer中,不用读盘 3、change buffer vs redo log   change buffer:更改记录直接写入内存中,不用从内存中取出对应的数据页 降低了随机读的消耗   redo log :更新时直接顺序写入磁盘,避免随机写的性能消耗       来源: https://www.cnblogs.com/man1s/p/11391835.html

JPA唯一索引更新删除的问题

…衆ロ難τιáo~ 提交于 2019-11-27 23:54:31
本来的功能是更新,我的做法是先删除再新增。表设置了字段A和字段B的唯一主键,先删除这个字段再新增一一模一样的值(包含字段A和字段B)时会报唯一主键的值重复了,百度了下,没找到原因,于是就不删除记录了,直接查出来再更新就可以了。问题解决了,记录下。。 转载于:https://www.cnblogs.com/JAYIT/p/10692163.html 来源: https://blog.csdn.net/weixin_30415801/article/details/99814681