精华内容
下载资源
问答
  • 唯一索引

    2018-02-28 17:54:29
    1 数据库表中若一个字段是唯一的 一定要添加唯一索引2 程序中判断是否唯一 在高并发的情况下 是无效的3 高并发的情况下 一定要添加分布式锁

    1 数据库表中若一个字段是唯一的 一定要添加唯一索引

    2 程序中判断是否唯一 在高并发的情况下 是无效的

    3 高并发的情况下 一定要添加分布式锁

    展开全文
  • 唯一索引or普通索引?阿里强制唯一索引? 1、 唯一索引和普通索引区别 先谈谈两者在查询操作上的区别,假设我们对一张User表建立mobile字段的索引。 1. 查询操作 若执行查询语句select * from user where mobile=...

    唯一索引or普通索引?阿里强制唯一索引?

    1、 唯一索引和普通索引区别

    先谈谈两者在查询操作上的区别,假设我们对一张User表建立mobile字段的索引。

    1. 查询操作

    若执行查询语句select * from user where mobile=123456789;

    唯一索引由于具有唯一性,当查询时将唯一字段作为条件时,查询到一个记录后将立即返回。

    普通索引由于不保证唯一性,直到遇见不符合条件的才返回。

    但实际上普通索引与唯一索引在性能上是微乎其微的,因为在查询语句的主要时间是花在了索引磁盘块的读取和数据页的读取上,两者读取磁盘块的个数基本一致。基本一致就是指特殊情况普通索引可能会多一个IO,即该记录正好在数据页的最后一个,那么还会读取下一个数据页(概率极低)。

    所以得出的结论是唯一索引跟普通索引在查询上性能相当。(PS:该结论先打个问号???



    2.更新操作

    在聊更新操作之前先谈谈Change Buffer。MySQL的数据数据存储是包含两个部分的:磁盘和内存。在内存中有一个内存缓冲池,缓存数据页和索引页以提高读效率,Change Buffer以提高写效率

    Change Buffer用于当索引页不在缓冲池中时,对数据页进行写操作时,并不会立即将磁盘加载到缓冲池然后写入数据,而是仅仅记录缓冲变更信息,等到读取数据时再将数据合并到缓冲池中。该数据页缓冲变更越多,提升的写操作性能越高。(PS:所以如果写入该数据后马上读取该数据,性能反而会降低)

    但是,遗憾的是,change Buffer并不支持唯一索引

    唯一索引在写入操作时需要做唯一性检查,change buffer无法做到!

    所以得出结论:唯一索引在写操作时性能会低于普通索引。

    所以在建索引选择时,尽量选择普通索引,而不去选择唯一索引。除非非常需要唯一性校验,防止插入脏数据!

    (该结论先打个问号???)






    2、阿里巴巴Java开发手册:强制使用唯一索引

    通过前面的理论分析,得出了唯一索引和普通索引的选择问题,但是在阅读阿里巴巴Java开发手册时,有如下的强制规定,并作出了解释:

    image-20200611192513705

    该规定在索引规约的第一条,并且是强制的,可见其重要性。阿里给出了两个理由:明显提升查找速度和防止脏数据的产生。

    第二条可以理解,没有唯一性校验,无论怎么校验都可能造成唯一性字段重复,自己写代码校验效率还可能低于MySQL的唯一性校验。

    第一条明显提升查找速度怎么理解?查找时唯一索引找到记录立即返回能明显提升查找速度?自己建表试验如下:


    实验:利用之前的一个数据库表,里面自己写入了100万条记录,id为主键,mobile字段保证唯一性。

    1. 利用mobile建立唯一性索引,并利用mobile字段走索引查询。

      image-20200611181918695

    image-20200611195151319

    1. 删除索引,利用mobile字段建立普通索引。然后清除缓存…重新执行语句

    image-20200611195240757

    image-20200611212956192

    两者的执行速度一样!!!





    实验二:加大数据量重试

    这时想到的是加数据,自己又生成了400万数据,加入数据库中,再次执行…

    image-20200611213727655

    使用唯一索引,查询结果如下

    image-20200611213920738

    使用普通索引,查询结果如下:

    image-20200611211751684

    多次反复试验,中间避免缓存,甚至重启MySQL,结果都是执行时间相当(1.35s)左右。

    500万条数据没看出明显提升。

    但阿里巴巴这句话肯定是经过多年实践磨砺出来的,是我试验哪里出了问题?还是数据量不够?希望大家指教
    但唯一性索引在保证脏数据上还是非常重要的!毕竟数据库大多数读多写少,没有多大必要去提升写的微弱效率而去写脏了数据库。

    个人还是比较倾向于唯一索引。

    展开全文
  • 唯一索引和非唯一索引

    千次阅读 2016-11-13 00:09:47
    从Oracle索引的特征上,我们可以简单的把索引分为Unique Indexes and Nonunique Indexes,即唯一索引和非唯一索引。 1 对于唯一索引唯一索引确保被索引的字段或多个联合字段在表中绝对不会有重复值;通常,我们在...
    

    从Oracle索引的特征上,我们可以简单的把索引分为Unique Indexes and Nonunique Indexes,即唯一索引和非唯一索引。

    1      对于唯一索引,唯一索引确保被索引的字段或多个联合字段在表中绝对不会有重复值;通常,我们在建表时,创建唯一约束或者主键约束,再或者建表以后给表添加唯一、主键约束时,Oracle会自动在主键、唯一约束的字段上创建唯一索引,并且索引的名字跟约束的名字一样,如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SQL> create table tt(id1 number primary key,id2 number,id3 number);
    Table created.
    SQL> select index_name,table_name,uniqueness from user_indexes where table_name='TT';
    INDEX_NAME                     TABLE_NAME                     UNIQUENESS
    ------------------------------ ------------------------------ ----------
    SYS_C0015420                   TT                             UNIQUE
    SQL> select table_name,constraint_name,index_name,constraint_type
    from user_constraints
    where table_name='TT';
    TABLE_NAME     CONSTRAINT_NAME  INDEX_NAME    CONSTRAINT_TYPE
    -------------- ---------------- ------------- ---------------
    TT             SYS_C0015420     SYS_C0015420  P

    我们在建测试表tt时在id1字段上创建了一个主键约束,当然该约束名字SYS_C0015420是Oracle自动分配给我们的,同时我们也看到tt表上有1个名为SYS_C0015420的索引。
    接下来,在id2字段上添加一个唯一约束,并且手动指定名字:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    SQL> alter table tt add constraint tt_id2_uk unique(id2);
    Table altered.
    SQL> select table_name,constraint_name,index_name,constraint_type
    from user_constraints
    where table_name='TT';
    TABLE_NAME                     CONSTRAINT_NAME                INDEX_NAME                     C
    ------------------------------ ------------------------------ ------------------------------ -
    TT                             SYS_C0015420                   SYS_C0015420                   P
    TT                             TT_ID2_UK                      TT_ID2_UK                      U
    SQL>  select index_name,table_name,uniqueness from user_indexes where table_name='TT';
    INDEX_NAME                     TABLE_NAME                     UNIQUENES
    ------------------------------ ------------------------------ ---------
    TT_ID2_UK                      TT                             UNIQUE
    SYS_C0015420                   TT                             UNIQUE
    SQL>

    我们发现,这tt表上的两个索引都是唯一索引,且名字都等同于各自对应的约束名字。
    然后,在该表上创建一个索引:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    SQL> create index idx_tt_id3 on tt(id3);
    Index created.
    SQL> select index_name,table_name,uniqueness from user_indexes where table_name='TT';
    INDEX_NAME                     TABLE_NAME                     UNIQUENES
    ------------------------------ ------------------------------ ---------
    IDX_TT_ID3                     TT                             NONUNIQUE
    TT_ID2_UK                      TT                             UNIQUE
    SYS_C0015420                   TT                             UNIQUE
    SQL>

    此时,发现该索引IDX_TT_ID3是一个非唯一索引,我们也可以使用create unique index...语句显示创建一个唯一索引。
    就唯一索引存储而言,每一个rowid会唯一对应表中的一条记录,在索引的叶子块儿中,数据按照索引字段升序存放。
    2     对于非唯一索引,允许被索引的字段有重复值。并且,非唯一索引的存放有别于唯一索引,它的数据在索引叶子块儿中是按照索引字段和rowid进行升序存放的。

    参考文章:http://www.oracleonlinux.cn/2011/11/oracle-11g-concepts-notes2/

    展开全文
  • mysql创建唯一索引

    万次阅读 2019-06-14 11:45:56
    查看索引 show index from 数据库表名 alter table 数据库add index 索引名称(数据库字段名称) PRIMARY KEY(主键索引) ...UNIQUE(唯一索引) ALTER TABLE `table_name` ADD UNIQUE (`column`) I...

    查看索引  show index from 数据库表名
    alter table 数据库add index 索引名称(数据库字段名称)
    PRIMARY KEY(主键索引)
    ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` )
    UNIQUE(唯一索引)
    ALTER TABLE `table_name` ADD UNIQUE (`column`)
    INDEX(普通索引)
    mysql>ALTER TABLE `table_name` ADD INDEX index_name ( `column` )
    FULLTEXT(全文索引)
    ALTER TABLE `table_name` ADD FULLTEXT ( `col


    多列索引
    ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )
    1.普通索引。
    这是最基本的索引,它没有任何限制。它有以下几种创建方式:
    (1)创建索引:CREATE INDEX indexName ON tableName(tableColumns(length));如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB 和 TEXT 类型,必须指定length,下同。
    (2)修改表结构:ALTER tableName ADD INDEX [indexName] ON (tableColumns(length)) 
    (3)创建表的时候直接指定:CREATE TABLE tableName ( [...], INDEX [indexName] (tableColumns(length)) ;


    2.唯一索引。
    它与前面的"普通索引"类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:
    (1)创建索引:CREATE UNIQUE INDEX indexName ON tableName(tableColumns(length))
    (2)修改表结构:ALTER tableName ADD UNIQUE [indexName] ON (tableColumns(length))
    (3)创建表的时候直接指定:CREATE TABLE tableName ( [...], UNIQUE [indexName] (tableColumns(lengt

    查看索引
    show index from tb_wz_all;

    展开全文
  • 创建时不是联合索引,而是唯一索引(player_id),更改为联合索引 CREATE TABLE `willow_player` ( `id` bigint(11) NOT NULL AUTO_INCREMENT, `player_id` bigint(16) NOT NULL DEFAULT '0' unique, `award_type...
  • 文章目录使用索引创建索引删除索引显示索引信息普通索引唯一索引unique与primary key的区别全文索引组合索引 参考 使用索引 创建索引 创建索引有3种方式 在创建表时指定索引; CREATE TABLE mytable( ID INT NOT ...
  • 创建 唯一索引和非唯一索引

    千次阅读 2018-05-10 18:51:16
    2017年09月16日 13:03:10阅读数:2718 步骤如下:一、创建唯一索引:1、打开navicat premium ,打开准备创建索引的数据库的查询编辑器;2、输入命令:CREATE UNIQUE INDEX 索引名 on 表名(想要创建索引的列名) ...
  • 唯一索引 生产环境已经存在且数据量不大的表 CREATE index "索引名" on "表名"("字段名") tablespace "表空间名" online; 举例: CREATE index IDX_WF_ORDER_CREATE_TIME on WF_ORDER(CREATE_TIME) tablespace ...
  • SQL Server创建索引时,可以指定Unique使之成为唯一索引。“唯一”顾名思义,但是两都到底有什么区别呢?因为索引也是一种物理结构,所以还是要从存储和结构上分析。 索引结构分叶级和非叶级,分析时我们要分开来看...
  • 深入理解四种数据库索引类型(- 唯一索引/非唯一索引 - 主键索引(主索引) - 聚集索引/非聚集索引 - 组合索引) 唯一索引/非唯一索引 主键索引(主索引) 聚集索引/非聚集索引 组合索引 唯一索引/非唯一索引 ...
  • 唯一约束和唯一索引

    2020-08-04 15:39:13
    数据库某字段要防重,描述过程中说 唯一索引 被纠正为 唯一约束。 区别 MYSQL中唯一约束和唯一索引的区别 1、唯一约束和唯一索引,都可以实现列数据的唯一,列值可以有null。 2、创建唯一约束,会自动创建一个同名的...
  • 普通索引与唯一索引

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

    万次阅读 2016-12-22 17:02:58
    同时索引的属性可以具有唯一性,即唯一索引唯一索引用于确保索引字段不存储重复的值,即强制索引字段的唯一性。缺省情况下,MongoDB的_id字段在创建集合的时候会自动创建一个唯一索引。本文主要描述唯一索引的用法...
  • 唯一索引和主键索引区别: 一个表只能有一个主键索引,但是可以有多个唯一索引 主键索引一定是唯一索引唯一索引则不一定是主键索引 主键索引可以与外键构成完整性约束,唯一索引不可以 唯一性索引列允许空值,而...
  • Mysql唯一索引 唯一约束

    万次阅读 2017-09-28 23:37:42
    Mysql唯一索引 唯一约束唯一索引作为mysql众多索引常用的一种,再一次业务中了解到此索引特在此记载Mysql唯一索引 唯一约束 唯一索引的的作用 唯一索引与唯一约束的区别 添加删除唯一索引的sql语句 需要注意的坑唯一...
  • msql唯一索引

    2018-08-20 09:50:24
    Mysql唯一索引 唯一约束 唯一索引作为mysql众多索引常用的一种,在一次业务代码编写中详细了解了下此索引在此记载,如果错误地方还望同学们斧正   Mysql唯一索引 唯一约束 唯一索引的的作用 唯一索引与唯一...
  • 天天搞数据,聚集索引非聚集索引,唯一索引,非唯一索引,天天见但不理解,网上也找不到几个能说囫囵的。今天处理数据库问题时被老大教育一番,然后给我普及了一数据库索引的知识。 聚集索引 聚集索引的作用对象是...
  • 一、MYSQL索引的分类 索引用于快速查找具有特定列值的行。如果没有索引,MySQL必须从第一行开始,然后读取整个表以查找...MYSQL的索引主要分为主键索引(PRIMARY KEY),唯一索引(UNIQUE),普通索引(INDEX)和全文索...
  • 点击链接 普通索引 唯一索引 全文索引 组合索引 ...
  • 下面分别介绍一下主键索引,唯一索引,普通索引 2、主键索引 它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候指定了主键,就会创建主键索引, CREATE INDEX不能用来创建主键索引,使用 ALTER TABLE来代替...
  • 普通索引 与 唯一索引1、普通索引2、唯一索引3、在不同业务情况下 唯一索引 与 普通索引 的选择场景 : 维护与一个市民系统 :查询过程更新过程 :总结 :change bufferchange buffer 和 redo log 运行情景插入数据读取...
  • 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。 索引可以极大的提高数据的查询速度,但是会降低插入、...唯一索引:如果能确定某个数据列将只包...
  • 聚集索引,非聚集索引,唯一索引 https://zhidao.baidu.com/question/1573903009844889260.html  聚集索引并不一定是唯一索引。主键是唯一的,所以创建了一个主键的同时,也就这个字段创建了一个...
  • 创建唯一索引

    2020-05-01 11:12:04
    唯一索引是不允许任何两行具有相同索引值胡索引。当现有胡数据存在重复胡键值时,大多数数据库不允许将新创建胡唯一索引于表一起保存。数据库还可能防止添加将在表中创建重复键值胡新数据。 ...
  • 查看索引 show index from 数据库表名 alter table 数据库add index 索引名称(数据库字段名称) PRIMARY KEY(主键索引) ...ALTER TABLE `table_name` ...UNIQUE(唯一索引) ALTER TABLE `table_name` ADD UNIQ
  • 主键索引和唯一索引的区别

    万次阅读 2018-07-18 10:03:18
    主键是一种约束,唯一索引是一种索引,两者在本质上是不同的。 主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键。 唯一性索引列允许空值,而主键列不允许为空值。 主键列在创建时,已经默认为空值 + ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 22,276
精华内容 8,910
关键字:

唯一索引