精华内容
下载资源
问答
  • 主要给大家介绍了关于MySQL死锁套路之唯一索引下批量插入顺序不一致的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者MySQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
  • 不经意间让我想起了数据库的索引,聚簇索引和唯一索引等,有了更进一步的理解,而且知道了它的时间空间效率。 索引顺序文件 索引顺序文件的效率分析: 多级索引顺序文件 参考:《王道操作系统》 ...


    0.思维导图

    在这里插入图片描述
    在这里插入图片描述

    1.无结构文件

    在这里插入图片描述

    2.有结构文件

    在这里插入图片描述
    定长记录:
    在这里插入图片描述
    不定长记录:
    在这里插入图片描述

    有结构文件的逻辑结构

    在这里插入图片描述

    顺序文件

    在这里插入图片描述
    在这里插入图片描述

    索引文件

    • 不经意间让我想起了数据库的索引,聚簇索引和唯一索引等,有了更进一步的理解,而且知道了它的时间空间效率。
      在这里插入图片描述

    索引顺序文件

    在这里插入图片描述
    索引顺序文件的效率分析:
    在这里插入图片描述

    多级索引顺序文件

    在这里插入图片描述

    参考:《王道操作系统》

    展开全文
  • 今天我也想分享一些我在同一个表里面,建上不同的唯一约束,不同的唯一索引,看下结果会怎样 首先简单建个测试表,不多,就4列 CREATE TABLE AAA3 (ID INT IDENTITY(1,1),Col1 VARCHAR(50),Col2 VARCHAR(50),Col...
    上次说了同一个对象里面不同触发器的执行顺序。今天我也想分享一些我在同一个表里面,建上不同的唯一约束,不同的唯一索引,看下结果会怎样
    

    首先简单建个测试表,不多,就4列

    CREATE TABLE AAA3 (ID INT IDENTITY(1,1),Col1 VARCHAR(50),Col2 VARCHAR(50),Col3 VARCHAR(50))

    情况1:然后往Col1 都添加上唯一索引和唯一约束。然后插入同样的数据,看下提示信息报那个先

    CREATE UNIQUE INDEX UQ_AAA3_Col1 ON AAA3(Col1)
    ALTER TABLE dbo.AAA3 ADD CONSTRAINT UQ_AAA3_Col1_1 UNIQUE(Col1)
    
    INSERT INTO dbo.AAA3
            (  Col1, Col2, Col3 )
    VALUES  ( N'1', N'',N''  )
    
    GO 2
    
    
    开始执行循环
    
    (1 行受影响)
    消息 2601,级别 14,状态 1,第 9 行
    不能在具有唯一索引“UQ_AAA3_Col1”的对象“dbo.AAA3”中插入重复键的行。重复键值为 (1)。
    语句已终止。
    ** 在执行批处理期间遇到错误。正在继续。
    批处理执行已完成 2 次。

    出错是肯定的,但是可以看到,出错信息是显示唯一索引 UQ_AAA3_Col1 而并非唯一约束创建的索引 UQ_AAA3_Col1_1 。这里大概可以知道是在同一个字段里面比较,唯一索引比唯一约束要优先。(当然谁那么无聊……)

    情况2:然后我尝试了一下在不同的列上面建唯一约束和唯一索引,看下是哪个比较优先,用在本例子,就是 Col2 创建唯一约束, Col3 创建唯一索引

    ALTER TABLE dbo.AAA3 ADD CONSTRAINT UQ_AAA3_Col2_1 UNIQUE(Col2) 
    CREATE UNIQUE INDEX UQ_AAA3_Col3 ON AAA3(Col3)
    
    INSERT INTO dbo.AAA3
            (  Col1, Col2, Col3 )
    VALUES  ( N'2', N'',N''  )
    
    消息 2627,级别 14,状态 1,第 9 行
    违反了 UNIQUE KEY 约束“UQ_AAA3_Col2_1”。不能在对象“dbo.AAA3”中插入重复键。重复键值为 ()。

    确实报唯一索引的抛出出的错。(我怀疑过,是因为Column_id 前后的关系吗?然而不是,即使我在Col2 建唯一索引,Col3 建唯一约束,结果也是一样。唯一约束的判定优先)。

    情况3 :将情况2 的约束索引+情况1 的唯一索引都干掉,新增一个组合唯一索引查看效果。把Col1,Col2 组成组合唯一约束,看下效果是哪个好

    ALTER TABLE dbo.AAA3 ADD CONSTRAINT UQ_AAA3_Col1_2 UNIQUE(Col1,Col2)
    
    
    INSERT INTO dbo.AAA3
            (  Col1, Col2, Col3 )
    VALUES  ( N'1', N'',N''  )
    
    消息 2627,级别 14,状态 1,第 9 行
    违反了 UNIQUE KEY 约束“UQ_AAA3_Col1_2”。不能在对象“dbo.AAA3”中插入重复键。重复键值为 (1, )。

    这个例子看出,符合唯一约束优先检测~so,我想到的情况就是这个样纸了~

     

    PS:有时觉得研究这些问题可能是没有什么实际应用场景~但是还是需要脑洞一下了~聊此一笑呵呵

     

    展开全文
  • 深入理解四种数据库索引类型(- 唯一索引/非唯一索引 - 主键索引(主索引) - 聚集索引/非聚集索引 - 组合索引) 唯一索引/非唯一索引 主键索引(主索引) 聚集索引/非聚集索引 组合索引 唯一索引/非唯一索引 ...

    深入理解四种数据库索引类型(- 唯一索引/非唯一索引 - 主键索引(主索引) - 聚集索引/非聚集索引 - 组合索引)

    • 唯一索引/非唯一索引
    • 主键索引(主索引)
    • 聚集索引/非聚集索引
    • 组合索引

    唯一索引/非唯一索引

    唯一索引

    1.唯一索引是在表上一个或者多个字段组合建立的索引,这个或者这些字段的值组合起来在表中不可以重复。

    非唯一索引

    2.非唯一索引是在表上一个或者多个字段组合建立的索引,这个或者这些字段的值组合起来在表中可以重复,不要求唯一。

    主键索引(主索引)

    3.主键索引(主索引)是唯一索引的特定类型。表中创建主键时自动创建的索引 。一个表只能建立一个主索引。

    聚集索引/非聚集索引

    4.聚集索引(聚簇索引),表中记录的物理顺序与键值的索引顺序相同。一个表只能有一个聚集索引。

    扩展:聚集索引和非聚集索引的区别?分别在什么情况下使用?

    聚集索引和非聚集索引的根本区别是表中记录的物理顺序和索引的排列顺序是否一致。

    聚集索引的表中记录的物理顺序与索引的排列顺序一致

    优点是查询速度快,因为一旦具有第一个索引值的记录被找到,具有连续索引值的记录也一定物理的紧跟其后。

    缺点是对表进行修改速度较慢,这是为了保持表中的记录的物理顺序与索引的顺序一致,而把记录插入到数据页的相应位置,必须在数据页中进行数据重排,降低了执行速度。在插入新记录时数据文件为了维持 B+Tree 的特性而频繁的分裂调整,十分低效。

    建议使用聚集索引的场合为:
    A.某列包含了小数目的不同值。
    B.排序和范围查找。

    非聚集索引的记录的物理顺序和索引的顺序不一致

    其他方面的区别:
    1.聚集索引和非聚集索引都采用了 B+树的结构,但非聚集索引的叶子层并不与实际的数据页相重叠,而采用中的记录在叶子层包含一个指向表数据页中的指针的方式。聚集索引的叶节点就是数据节点,而非聚集索引的叶节点仍然是索引节点。

    2.非聚集索引添加记录时,不会引起数据顺序的重组。

    看上去聚簇索引的效率明显要低于非聚簇索引, 因为每次使用辅助索引检索都要经过两次 B+树查找, 这不是多此一举吗? 聚簇索引的优势在哪?

    1.由于行数据和叶子节点存储在一起, 这样主键和行数据是一起被载入内存的, 找到叶子节点就可以立刻将行数据返回了, 如果按照主键 Id 来组织数据, 获得数据更快。

    2.辅助索引使用主键作为"指针", 而不是使用地址值作为指针的好处是, 减少了当出现行移动或者数据页分裂时,辅助索引的维护工作, InnoDB 在移动行时无须更新辅助索引中的这个"指针"。 也就是说行的位置会随着数据库里数据的修改而发生变化, 使用聚簇索引就可以保证不管这个主键 B+树的节点如何变化, 辅助索引树都不受影响。

    建议使用非聚集索引的场合为:
    a.此列包含了大数目的不同值;
    b.频繁更新的列

    5.组合索引(联合索引)

    基于多个字段而创建的索引就称为组合索引。

    创建索引
    create index idx1 on table1(col1,col2,col3)
    查询
    select * from table1 where col1= A and col2= B and col3 = C
    

    组合索引查询的各种场景
    组合索引 Index (A, B, C)

    下面条件可以用上该组合索引查询:
     A>5
     A=5 AND B>6
     A=5 AND B=6 AND C=7
     A=5 AND B=6 AND C IN (2, 3)

    下面条件将不能用上组合索引查询:
     B>5 ——查询条件不包含组合索引首列字段
     B=6 AND C=7 ——理由同上

    下面条件将能用上部分组合索引查询(重要! ! ! ! ) :
     A>5 AND B=2 ——当范围查询使用第一列, 查询条件仅仅能使
    用第一列
     A=5 AND B>6 AND C=2 ——范围查询使用第二列, 查询条件仅仅能使用
    前二列
     A=5 AND B IN (2, 3) AND C=2 ——理由同上

    组合索引排序的各种场景:

    兹有组合索引 Index(A,B)。
     下面条件可以用上组合索引排序:
     ORDER BY A——首列排序
     A=5 ORDER BY B——第一列过滤后第二列排序
     ORDER BY A DESC, B DESC——注意, 此时两列以相同顺序排序
     A>5 ORDER BY A——数据检索和排序都在第一列

    下面条件不能用上组合索引排序:
     ORDER BY B ——排序在索引的第二列
     A>5 ORDER BY B ——范围查询在第一列, 排序在第二列
     A IN(1,2) ORDER BY B ——理由同上
     ORDER BY A ASC, B DESC ——注意, 此时两列以不同顺序排序

    alter table users add index lname_fname_age(lname,fname,age);
    

    创建了 lname_fname_age 多列索引,相当于创建了(lname)单列索引,
    (lname,fname)联合索引以及(lname,fname,age)联合索引。

    举例说明:上面给出一个多列索引(username,password,last_login),当
    三 列 在 where 中 出 现 的 顺 序 如 (username,password,last_login) 、
    (username,password)、(username)才能用到索引,如下面几个顺序
    (password,last_login) 、 (passwrod) 、 (last_login)--- 这 三 者 不 从
    username 开始,(username,last_login)---断层,少了 password,都无
    法利用到索引。因为 B+tree 多列索引保存的顺序是按照索引创建的顺序,
    检索索引时按照此顺序检索。



    作者:六尺帐篷
    链接:https://www.jianshu.com/p/f49ee80c4956
    來源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

    展开全文
  • 普通索引与唯一索引

    万次阅读 多人点赞 2019-04-08 20:20:06
    所谓唯一索引,就是在创建索引时,限制索引的值必须是唯一的。通过该类型的索引可以更快速地查询某条记录。 普通索引还是唯一索引? 假设你在维护一个市民系统,每个人都有一个唯一的身份证号,而且业务代码已经...

    所谓普通索引,就是在创建索引时,不附加任何限制条件(唯一、非空等限制)。该类型的索引可以创建在任何数据类型的字段上。

    所谓唯一索引,就是在创建索引时,限制索引的值必须是唯一的。通过该类型的索引可以更快速地查询某条记录。

    普通索引还是唯一索引?

    假设你在维护一个市民系统,每个人都有一个唯一的身份证号,而且业务代码已经保证了不会写入两个重复的身份证号。如果市民系统需要按照身份证号查姓名,就会执行类似这样的SQL语句:

    select name from CUser where id_card='xxxxxxxyyyyyyzzzzz';

    所以你一定会考虑在id_card字段上建索引。由于身份证号字段比较大,这里不建议将身份证号当做主键,现在有两个选择,要么给id_card字段创建唯一索引,要么创建一个普通索引。如果业务代码已经保证了不会写入重复的身份证号,那么这两个选择逻辑上都是正确的。

    现在需要思考的是,从性能的角度考虑,我们应该选择唯一索引还是普通索引?选择的依据又是什么呢?我们以<深入浅出索引(上)>中的例子来说明,假设字段k上的值都不重复。

    InnoDB的索引组织结构

    接下来,我们就从这两种索引对查询语句和更新语句的性能影响来进行分析。

    查询过程

    假设,执行的查询语句是select id from T where k=5。这个查询语句在索引树上查找的过程,先是通过B+树从树根开始,按层搜索到叶子节点,也就是图中右下角的这个数据页,然后可以认为数据页内部通过二分法来定位记录。

    • 对于普通索引来说,查找到满足条件的第一个记录(5, 500)后,需要查找下一个记录,直到碰到第一个不满足k=5条件的记录。
    • 对于唯一索引来说,由于索引定义了唯一性,查找到第一个满足条件的记录后,就会停止继续检索。

    那么,这个不同带来的性能差距会有多少呢?答案是,微乎其微

    我们都知道,InnoDB的数据是按数据页为单位来读写的。也就是说,当需要读一条记录的时候,并不是将这个记录本身从磁盘读出来,而是以页为单位,将其整体读入内存。在InnoDB中,每个数据页的大小默认是16KB。

    因为引擎是按页读写的,所以说,当找到k=5的记录的时候,它所在的数据页就都在内存里了。那么,对于普通索引来说,要多做的那一次“查找和判断下一条记录”的操作,就只需要一次指针寻找和一次计算。

    当然,如果k=5这个记录刚好是这个数据页的最后一个记录,那么要取下一个记录,必须读取下一个数据页,这个操作会稍微复杂一些。但是我们之前计算过,对于整型字段,一个数据页可以放近千个key,因此出现这种情况的概率会很低。所以,我们计算平均性能差异时,仍然可以认为这个操作成本对于现在的CPU来说可以忽略不计。

    更新过程

    为了说明普通索引和唯一索引对更新语句性能的影响这个问题,需要先了解一下change buffer的概念:

    当需要更新一个数据页时,如果数据页在内存中就直接更新,而如果这个数据页还没有在内存中的话,在不影响数据一致性的前提下,InnoDB会将这些更新操作缓存在change buffer中,这样就不需要从磁盘中读入这个数据页了。在下次查询需要访问这个数据页的时候,将数据页读入内存,然后执行change buffer中与这个页有关的操作。通过这种方式就能保证这个数据逻辑的正确性。

    需要说明的是,虽然名字叫作change buffer,实际上它是可以持久化的数据。也就是说,change buffer在内存中有拷贝,也会被写入到磁盘上。将change buffer中的操作应用到原数据页,得到最新结果的过程称为merge。除了访问这个数据页会触发merge外,系统有后台线程会定期merge。在数据库正常关闭(shutdown)的过程中,也会执行merge操作。

    显然,如果能够将更新操作先记录在change buffer,减少读磁盘,语句的执行速度会得到明显的提升。而且,数据读入内存是需要占用buffer pool的,所以这种方式还能够避免占用内存,提高内存利用率。

    那么,什么条件下可以使用change buffer呢?

    对于唯一索引来说,所有的更新操作都要先判断这个操作是否违反唯一性约束。比如,要插入(4, 400)这个记录,就要先判断现在表中是否已经存在k=4的记录,而这必须要将数据页读入内存才能判断。如果都已经读入到内存了,那直接更新内存会更快,就没必要使用change buffer了。因此,唯一索引的更新就不能使用change buffer,实际上也只有普通索引可以使用。

    change buffer用的是buffer pool里的内存,因此不能无限增大。change buffer的大小,可以通过参数innodb_change_buffer_max_size来动态设置。这个参数设置为50的时候,表示change buffer的大小最多只能占用buffer pool的50%。

    现在,我们已经理解了change buffer的机制,我们再回过头来分析这个问题,如果要在这张表中插入一个新记录(4, 400)的话,InnoDB的处理流程是怎样的。

    第一种情况是,这个记录要更新的目标页在内存中。这时,InnoDB的处理流程如下:

    • 对于唯一索引来说,找到3和5之间的位置,判断到没有冲突,插入这个值,语句执行结束。
    • 对于普通索引来说,找到3和5之间的位置,插入这个值,语句执行结束。

    这样看来,普通索引和唯一索引对更新语句性能影响的差别,只是一个判断,只会耗费微小的CPU时间。但是,这不是我们关注的重点。

    第二种情况是,这个记录要更新的目标页不在内存中。这时,InnoDB的处理流程如下:

    • 对于唯一索引来说,需要将数据页读入内存,判断到没有冲突,插入这个值,语句执行结束。
    • 对于普通索引来说,则是将更新记录在change buffer,语句执行就结束了。

    将数据从磁盘读入内存涉及随机IO的访问,是数据库里面成本最高的操作之一。change buffer因为减少了随机磁盘访问,所以对更新性能的提升会很明显。现实中就发生过这样的事情,有个DBA的同学说,他负责的某个业务的库内存命中率突然从99%降低到75%,整个系统处于阻塞状态,更新语句全部堵住。而探究其原因后,才发现这个业务有大量插入数据的操作,而他在前一天把其中的某个普通索引改成了唯一索引。

    change buffer的使用场景

    通过以上分析,我们了解了使用change buffer对更新过程的加速作用,也清楚了change buffer只限于用在普通索引的场景下,而不适用于唯一索引。那么,现在有一个问题就是:普通索引的所有场景,使用change buffer都可以起到加速作用吗?

    因为merge的时候是真正进行数据更新的时刻,而change buffer的主要目的就是将记录的变更动作缓存下来,所以在一个数据页做merge之前,change buffer记录的变更越多(也就是这个页面上要更新的次数越多),收益就越大。

    因此,对于写多读少的业务来说,页面在写完以后马上被访问的概率比较小,此时change buffer的使用效果最好。这种业务模型常见的就是账单类、日志类系统。

    反过来,假设一个业务的更新模式是写入之后马上会做查询,那么即使满足了条件,将更新先记录在change buffer,但之后由于马上要访问这个数据页,会立即触发merge过程。这样随机访问IO的次数不会减少,反而增加了change buffer的维护代价。所以,对于这种业务模式来说,change buffer反而起到了副作用。

    索引选择和实战

    回到一开始的问题,普通索引和唯一索引应该怎么选择。其实,这两类索引在查询能力上是没差别的,主要考虑的是对更新性能的影响。所以,这里建议尽量选择普通索引。如果所有的更新后,都马上伴随着对这个记录的查询,那么应该关闭change buffer。而在其他情况下,change buffer都能提升更新性能。

    在实际应用中,你会发现,普通索引和change buffer的配合使用,对于数据量大的表的更新优化还是很明显的。特别的,在使用机械硬盘的时候,change buffer这个机制的收效是非常显著的。所以,当你有一个类似“历史数据”的库,并且出于成本考虑用的是机械硬盘时,那你应该特别关注这些表里的索引,尽量使用普通索引,然后把change buffer尽量开大,以确保这个“历史数据”表的数据写入速度。

    change buffer和redo log

    理解了change buffer的原理,我们很容易联想到之前学习的redo log和WAL。我们知道,WAL提升性能的核心机制,也的确是尽量减少随机读写,这两个概念确实容易混淆。所以,这里把它们放到了同一个流程里来说明,便于我们区分这两个概念。

    现在,我们要在表上执行这个插入语句:

    insert into t(id,k) values(id1,k1),(id2,k2);

    这里,我们假设当前k索引树的状态,查找到位置后,k1所在的数据页在内存(InnoDB buffer pool)中,k2所在的数据页不在内存中。如图所示是带change buffer的更新状态图。

    change buffer的更新过程

    分析这条更新语句,你会发现它涉及了四个部分:内存、redo log(ib_log_fileX)、数据表空间(t.ibd)、系统表空间(ibdata1)。

    这条更新语句做了如下的操作(按照图中的数字顺序):

    • Page1在内存中,直接更新内存;
    • Page2没有在内存中,就在内存的change buffer区域,记录下"我要往Page2插入一行"这个信息。
    • 将上述两个动作记入redo log中(图中3和4)。

    做完上面这些,事务就可以完成了。所以,你会看到,执行这条更新语句的成本很低,就是写了两处内存,然后写了一次磁盘(两次操作合在一起写了一次磁盘),而且还是顺序写的。同时,图中的两个虚线箭头,是后台操作,不影响更新的响应时间。那在这之后的读请求,要怎么处理呢?

    比如,我们现在要执行select * from t where k in (k1, k2)。这里,给出了这两个请求的流程图:

    change buffer的读过程

    从图中可以看到:

    • 读Page1的时候,直接从内存返回。这也说明了,WAL之后如果读数据,不一定要读磁盘,也不一定要从redo log里面把数据更新以后才可以返回,图中的状态就反应了,虽然磁盘上还是之前的数据,但是这里直接从内存返回结果,结果是正确的。
    • 要读Page2的时候,需要把Page2从磁盘读入内存中,然后应用change buffer里面的操作日志,生成一个正确的版本并返回结果。

    可以看到,直到需要读Page2的时候,这个数据页才会被读入内存。所以,如果要简单的对比这两个机制在提升更新性能上的收益的话,redo log主要节省的是随机写磁盘的IO消耗(转成顺序写),而change buffer主要节省的则是随机读磁盘的IO消耗。

    总结

    这次,我们从普通索引和唯一索引的选择开始,了解了数据的查询和更新过程,然后说明了change buffer的机制以及应用场景,最好讲到了索引选择的实践。由于唯一索引用不上change buffer的优化机制,因此如果业务可以接收,从性能角度出发还是建议优先考虑非唯一索引。

    最后补充:

    • 首先,业务正确性优先,我们一开始的前提就是"业务代码已经保证不会写入重复数据"的情况下,讨论性能问题。如果业务不能保证,或者业务就是要求数据库来做约定,那么没得选,必须创建唯一索引。这种情况下,本篇文章的意义在于,如果碰上了大量插入数据慢、内存命中率低的时候,可以给你多提供一个排查的思路。
    • 然后,在一些"归档库"的场景,你是可以考虑使用普通索引的。比如,线上数据只需要保留半年,然后历史数据保存在归档库。这时候,归档数据已经是确保没有唯一键冲突了。要提高归档效率,可以考虑把表里面的唯一索引改成普通索引。

    思考:通过change buffer更新过程图可以看到,change buffer一开始是写内存的,那么如果这个时候机器掉电重启,会不会导致change buffer丢失呢?change buffer丢失可不是小事儿,再从磁盘读入数据可就没有了merge过程,就等于是数据丢失了。会不会出现这种情况呢?

    答案:不会丢失。虽然只是更新内存,但是在事务提交的时候,我们把change buffer的操作也记录到了redo log里了,所以崩溃恢复的时候,change buffer也能找回来。

    下面给出merge的执行流程:

    • 从磁盘读入数据页到内存(老版本的数据页)。
    • 从change buffer里找出这个数据页的change buffer记录(可能有多个),依次应用,得到新版数据页。
    • 写redo log。这个redo log包含了数据的变更和change buffer的变更。

    到这里merge过程就结束了。这时候,数据页和内存中change buffer对应的磁盘位置都还没有修改,属于脏页,之后各自刷回自己的物理数据,就是另外一个过程了。

    展开全文
  • 天天搞数据,聚集索引非聚集索引,唯一索引,非唯一索引,天天见但不理解,网上也找不到几个能说囫囵的。今天处理数据库问题时被老大教育一番,然后给我普及了一数据库索引的知识。 聚集索引 聚集索引的作用对象是...
  • 对原文章排版进行了一些改进,方便查看,以下为原文章地址。...(1)定义:最基本的索引类型,没有唯一性之类的限制。 (2)创建方式: a、创建索引,例如CREATE INDEX ON tablename (列的列表); b、修改表,例如ALTER
  • 说明:本文为唯一索引和非唯一索引性能对比参考手册 用途:本文仅供初学者熟悉了解索引或优化参考 标签:Oracle优化、索引存储结构、唯一索引、非唯一索引、B树索引 温馨提示:如果您发现本文哪里写的有问题或者有更...
  • 普通索引、唯一索引和复合索引
  • MySQL普通索引、唯一索引、主索引、外键索引、复合索引、全文索引的使用
  • 唯一索引/非唯一索引 主键索引(主索引) 聚集索引/非聚集索引 组合索引 唯一索引/非唯一索引 唯一索引 1.唯一索引是在表上一个或者多个字段组合建立的索引,这个或者这些字段的值组合起来在表中不可以重复...
  • 一、MYSQL索引的分类 索引用于快速查找具有特定列值的行。如果没有索引,MySQL必须从第一行开始,然后读取整个表以查找...MYSQL的索引主要分为主键索引(PRIMARY KEY),唯一索引(UNIQUE),普通索引(INDEX)和全文索...
  • 数据库的唯一索引

    千次阅读 2016-12-15 16:55:44
    唯一索引是不允许表中任何两行具有相同索引值的索引。  当现有的数据中存在重复的键值时,大多数数据库不允许把新创建的唯一索引与表一起保存。数据库还可能防止添加将在表中创建重复键值的新数据。主键索引数据库...
  • 我秃了!唯一索引、普通索引我该选谁?

    千次阅读 多人点赞 2021-09-06 00:35:26
    你遇到过不知道如何选择唯一索引和普通索引的场景么?你知道他俩的原理和区别么?来不及了,快上车!!
  • 唯一索引3.复合索引(联合索引) mysql的索引主要分为3类: 1.单列索引 2.联合索引(复合索引) 3.唯一索引 ----------------------------------------------------- 在介绍索引的分类之前我们必须知道什么叫做索引: ...
  • 索引分为聚簇索引和非聚簇索引两种,聚簇索引 是按照数据存放的物理位置为顺序的,而非聚簇索引就不一样了;聚簇索引能提高多行检索的速度,而非聚簇索引对于单行的检索很快。 根据数据库的功能,可以在数据库...
  • mysql普通索引与唯一索引区别

    千次阅读 2019-07-21 12:39:10
    一、创建索引语句差异 1.1 普通索引 ALTER TABLE `tt_test` ...1.2 唯一索引 ALTER TABLE `tt_test` ADD UNIQUE INDEX `un_index_title` (`title`) USING BTREE ; 二、查询语句差异 我们用这个查询语句来分析一下...
  • 普通索引和唯一索引的区别

    千次阅读 2018-10-11 10:13:15
    唯一索引和普通索引使用的结构都是B-tree,执行时间复杂度都是O(log n)。 1、普通索引  普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度。因此,应该只为那些最经常出现在查询条件...
  • 在MySQL学习:深入浅出索引中学习了MySQL普通索引和唯一索引。了解了普通索引与唯一索引的区别。 普通索引:最基本的索引,没有任何限制。 唯一索引:与普通索引类似,不同的就是:索引列的值必须唯一,但允许有...
  • 其中唯一索引是给所做的索引增加了唯一性的约束,添加,修改索引列中数据时,不允许出现重复值.它可以是聚集索引,也可以是非聚集的,就看你如何定义 主键索引是把主键列定义为索引,主键具有唯一性,所以主键索引是唯一...
  • 一 主键和唯一索引都要求值唯一,但是它们还是有区别的: ①.主键是一种约束,唯一索引是一种索引; ②.一张表只能有一个主键,但可以创建多个唯一索引; ③.主键创建后一定包含一个唯一索引唯一索引并一定是主键...
  • MySQL 普通索引、唯一索引和主索引

    千次阅读 2017-12-20 13:30:59
     普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度。因此,应该只为那些最经常出现在查询条件(WHERE column = ...)或排序条件(ORDER BY column)中的数据列创建索引。只要有可能,就应该...
  • B树与红黑树最广泛的应用就是数据库索引,熟练使用索引是程序员最重要的基本功之一。索引的数据结构可以是树,也可以是哈希表。常用的数据库都是树结构的索引,本篇的背景也全部以树结构的索引为前提。本文旨在梳理...
  • MongoDB 提供了多样性的索引支持,索引信息被保存在system.indexes 中,且默认总是为_id创建索引,它的索引使用基本和MySQL 等关系型数据库一样。其实可以这样说说,索引是凌驾于数据存储系统之上的另一层系统,所以...
  • 索引对数据库性能的影响? 本质:缩小查询范围。大大减少需要扫描的数据量。...主键索引是唯一索引,但唯一索引不是主键索引, 主键可以和外键构成参照完整性约束,防止数据不一致。 mysql索引的创建原则? ...
  • 索引、唯一索引、聚集索引

    千次阅读 2012-04-28 09:14:50
    索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存。如果没有索引,执行查询时MySQL必须从第一个记录开始扫描...如果表有1000个记录,通过索引查找记录至少要比顺序扫描记录快100倍。 索引
  • 主键和唯一索引的区别

    千次阅读 2018-08-14 09:39:40
    一 主键和唯一索引都要求值唯一,但是它们还是有区别的: ①.主键是一种约束,唯一索引是一种索引; ②.一张表只能有一个主键,但可以创建多个唯一索引; ③.主键创建后一定包含一个唯一索引唯一索引并一定是主键...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 223,357
精华内容 89,342
关键字:

唯一索引顺序