精华内容
下载资源
问答
  • 主要给大家介绍了关于MongoDB中唯一索引(Unique)的那些事,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • MYSQL 唯一索引UNIQUE使用方法详解

    万次阅读 2018-07-23 23:51:27
    创建唯一索引的目的不是为了提高访问速度,而只是为了避免数据出现重复(在插入数据的时候,如果唯一索引的插入值重复,所以插入就会报错),索引可以有多个但索引列的值必须唯一,索引列的值允许有空值。...

    创建唯一索引的目的不是为了提高访问速度,而只是为了避免数据出现重复(在插入数据的时候,如果唯一索引的插入值重复,所以插入就会报错),索引可以有多个但索引列的值必须唯一,索引列的值允许有空值。如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该使用关键字UNIQUE


    把它定义为一个唯一索引。


    创建唯一索的方法


    操作表

     代码如下复制代码

     CREATE TABLE `wb_blog` (       

       `id` smallint(8) unsigned NOT NULL,       

      `catid` smallint(5) unsigned NOT NULL DEFAULT '0',       

       `title` varchar(80) NOT NULL DEFAULT '',       

       `content` text NOT NULL,       

       PRIMARY KEY (`id`),       

      )

    1、创建唯一索可以使用关键字UNIQUE随表一同创建

     代码如下复制代码

     mysql> CREATE TABLE `wb_blog` (  

        ->   `id` smallint(8) unsigned NOT NULL,   
        ->   `catid` smallint(5) unsigned NOT NULL DEFAULT '0',  

        ->   `title` varchar(80) NOT NULL DEFAULT '',   
         ->   `content` text NOT NULL,  

       ->   PRIMARY KEY (`id`),  

        ->   UNIQUE KEY `catename` (`catid`)  

        -> ) ;  

    9 Query OK, 0 rows affected (0.24 sec)

    上面代码为wb_blog表的'catid'字段创建名为catename的唯一索引


    2、在创建表之后使用CREATE命令来创建

     代码如下复制代码


     mysql> CREATE UNIQUE INDEX catename ON wb_blog(catid);  

    Query OK, 0 rows affected (0.47 sec)

    如果不需要唯一索引,则可以这样删除

     代码如下复制代码

     mysql> ALTER TABLE wb_blog DROP INDEX catename;  

    Query OK, 0 rows affected (0.85 sec)


    如果要增加索引

     代码如下复制代码

    alter table user add unique index(user_id,user_name);

    注意

    唯一索引。

    它与前面的"普通索引"类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:
    (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(length));

    3.主键索引

    它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引:CREATE TABLE testIndex(i_testID INT NOT NULL AUTO_INCREMENT,vc_Name VARCHAR(16) NOT NULL,PRIMARY KEY(i_testID)); 当然也可以用ALTER命令。

    转载于:https://www.cnblogs.com/wuhan729/p/8443119.html

    展开全文
  • 2、添加UNIQUE(唯一索引) mysql>ALTER TABLE `table_name` ADD UNIQUE ( `column` )  3、添加INDEX(普通索引) mysql>ALTER TABLE `table_name` ADD INDEX index_name ( `column` ) 4、添加FULLTEXT(全文索引) ...
  • mysql中unique创建唯一索引

    万次阅读 2018-06-24 21:30:19
    主键约束要保证数据既不可以为空也不可重复,而UNIQUE唯一索引,是可以允许数据为空的,而且唯一索引的主要作用就是避免数据重复(不是提高效率哦)。 本人也目前也是小白一个,在网上查得有人建表时这样添加唯一...

    很多情况下我们都会要求某些字段不可重复,如用户名、手机号等,我们可以在MySQL数据表中设置指定的字段为 PRIMARY KEY(主键) 或者 UNIQUE(唯一) 索引来保证数据的唯一性。主键约束要保证数据既不可以为空也不可重复,而UNIQUE唯一索引,是可以允许数据为空的,而且唯一索引的主要作用就是避免数据重复(不是提高效率哦)。
    本人也目前也是小白一个,在网上查得有人建表时这样添加唯一索引:

    DROP TABLE
    IF EXISTS `t_user`;
    
    CREATE TABLE `t_user` (
        ID VARCHAR (100) NOT NULL COMMENT '主键',
        NAME VARCHAR (30) NOT NULL COMMENT '用户昵称',
        PASSWORD VARCHAR (100) NOT NULL COMMENT '用户密码',
        EMAIL VARCHAR (50) NOT NULL COMMENT '用户邮箱',
        PHONENUMBER VARCHAR (20) NOT NULL COMMENT '用户手机号码',
        PRIMARY KEY (`ID`),
        UNIQUE(NAME, PHONENUMBER)
    );

    但是我在添加数据时发现,这个唯一约束只对括号里的第一个字段NAME有作用,而对后面的PHONENUMBER没有作用(无论后面添加几个都是只对第一个有用)。也有说如果允许字段为空唯一索引就会失效,可是我这里需要创建索引的字段也没有允许为空的
    不过如果无需命名UNIQUE,只创建一个唯一索引的话,这是可以的

    还有一种方式说如果需要命名 UNIQUE 约束,以及为多个列定义 UNIQUE 约束,可以使用以下SQL

    DROP TABLE
    IF EXISTS `t_user`;
    
    CREATE TABLE `t_user` (
        ID VARCHAR (100) NOT NULL COMMENT '主键',
        NAME VARCHAR (30) NOT NULL COMMENT '用户昵称',
        PASSWORD VARCHAR (100) NOT NULL COMMENT '用户密码',
        EMAIL VARCHAR (50) NOT NULL COMMENT '用户邮箱',
        PHONENUMBER VARCHAR (20) NOT NULL COMMENT '用户手机号码',
        PRIMARY KEY (`ID`),
        CONSTRAINT uc_user UNIQUE (NAME, EMAIL)
    );
    

    可是不知道为什么我测的还是有问题,如果括号里两个字段,还是只对第一个字段有作用,如果有三个及三个以上的字段,这个唯一索引就失效了,对这三个任何一个字段都没有作用
    不过既然有人这么写,他应该是测试没问题的,可是在我这里就是没有作用,所以最后,我只能一条一条写了(也可以不命名,好像很笨的样子,不过测试通过了)

    ID VARCHAR (100) NOT NULL COMMENT '主键',
        NAME VARCHAR (30) NOT NULL COMMENT '用户昵称',
        PASSWORD VARCHAR (100) NOT NULL COMMENT '用户密码'
        EMAIL VARCHAR (50) NOT NULL COMMENT '用户邮箱',
        PHONENUMBER VARCHAR (20) NOT NULL COMMENT '用户手机号码',
        PRIMARY KEY (`ID`),
        UNIQUE KEY nameindex(NAME),
        UNIQUE KEY emailindex(EMAIL),
        UNIQUE KEY PHONENUMBERindex(PHONENUMBER)

    学习更多:
    http://www.runoob.com/mysql/mysql-handling-duplicates.html
    https://www.aliyun.com/jiaocheng/1107895.html?spm=5176.100033.2.11.AjpvRQ
    http://www.w3school.com.cn/sql/sql_unique.asp

    展开全文
  • 索引是我们经常使用的一种数据库搜索优化手段。适当的业务操作场景使用适当的索引方案可以...唯一索引unique index和一般索引normal index最大的差异就是在索引列上增加了一层唯一约束。添加唯一索引的数据列...

    索引是我们经常使用的一种数据库搜索优化手段。适当的业务操作场景使用适当的索引方案可以显著的提升系统整体性能和用户体验。在Oracle中,索引有包括很多类型。不同类型的索引适应不同的系统环境和访问场景。其中,唯一性索引Unique Index是我们经常使用到的一种。

    唯一性索引unique index和一般索引normal index最大的差异就是在索引列上增加了一层唯一约束。添加唯一性索引的数据列可以为空,但是只要存在数据值,就必须是唯一的。

    那么,在使用唯一性索引时,同一般索引有什么差异呢?下面通过一系列的演示实验来说明。

    1、实验环境准备

    为了体现出一致性和可能的差异性,选择相同的数据值列加入不同类型的索引结构。

    SQL> select * from v$version where rownum<2;
    BANNER

    Oracle Database11gEnterpriseEdition Release11.2.0.1.0 - Production

    SQL> create table t as select * from dba_objects;
    Table created

    //保证data_object_id和object_id取值相同;
    SQL> update t set data_object_id=object_id;
    72581 rows updated

    SQL> commit;
    Commit complete

    //普通索引
    SQL> create index idx_t_normalid on t(object_id);
    Index created

    //唯一性索引
    SQL> create unique index idx_t_uniid on t(data_object_id);
    Index created

    SQL> exec dbms_stats.gather_table_stats(user,‘T’,cascade => true);
    PL/SQL procedure successfully completed

    2、体积容量比较

    在环境准备中,我们将索引列取值设置为完全相同,尽量避免由于外在原因引起的差异。下面我们检查数据字典中的容量比较信息。

    首先是查看索引段index segment信息。

    SQL> select segment_name, segment_type, bytes, blocks, extents from dba_segments where segment_name in (‘IDX_T_NORMALID’,‘IDX_T_UNIID’);

    SEGMENT_NAME SEGMENT_TYPE BYTES BLOCKS EXTENTS


    IDX_T_NORMALID INDEX 983040 120 15
    IDX_T_UNIID INDEX 917504 112 14

    一般索引normal index较唯一性索引空间消耗略大。索引idx_t_normalid占据15个分区,120个block。略大于idx_t_uniid的14个分区块。

    这个地方需要注意一下,在数据字典中一个segment的分区占据,是Oracle系统分配给的空间,并不意味着全部使用殆尽。可能两个索引结构差异很小,但是额外多分配出一个extent。

    索引叶子结构上,检查数据字典内容。

    SQL> select index_name, index_type, UNIQUENESS, BLEVEL, LEAF_BLOCKS, DISTINCT_KEYS from dba_indexes where index_name in (‘IDX_T_NORMALID’,‘IDX_T_UNIID’);

    INDEX_NAME INDEX_TYPE UNIQUENESS BLEVEL LEAF_BLOCKS DISTINCT_KEYS


    IDX_T_UNIID NORMAL UNIQUE 1 106 51330
    IDX_T_NORMALID NORMAL NONUNIQUE 1 113 51330

    两者的差异不大,normal index空间消耗要略大于unique index。

    结论:从数据字典反映出的情况可以知道,同一般索引相比,唯一性索引的空间消耗略小一些。由于我们采用的实验数据都是相同的,这一点点的差距可能就意味着两种索引类型在存储结构上存在略微的差异。

    3、违反约束实验

    作为唯一性索引,在添加创建和进行dml操作的时候,都会严格发挥出约束的作用。

    SQL> insert into t select * from t where rownum<2;

    insert into t select * from t where rownum<2

    ORA-00001:违反唯一约束条件(SYS.IDX_T_UNIID)

    4、等号检索实验

    当我们进行等号查询的时候,Oracle对两种索引生成的执行计划有何种差异?注意:下面的select检索之前,都使用flush语句对shared_pool和buffer_cache进行清理。

    –精确查询
    SQL> select * from t where object_id=1000;
    执行计划

    Plan hash value: 776407697

    | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

    | 0 | SELECT STATEMENT | | 1 | 101 | 2 (0)| 00:00:01 |
    | 1 | TABLE ACCESS BY INDEX ROWID| T | 1 | 101 | 2 (0)| 00:00:01 |
    |* 2 | INDEX RANGE SCAN | IDX_T_NORMALID | 1 | | 1 (0)| 00:00:01 |

    Predicate Information (identified by operation id):

    2 - access(“OBJECT_ID”=1000)
    统计信息

       528 recursive calls
         0 db block gets
        87 consistent gets
        11 physical reads
         0 redo size
      1200 bytes sent via SQL*Net to client
       376 bytes received via SQL*Net from client
         2 SQL*Net roundtrips to/from client
         4 sorts (memory)
         0 sorts (disk)
         1 rows processed
    

    SQL> select * from t where data_object_id=1000;

    执行计划

    Plan hash value: 335537167


    | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

    | 0 | SELECT STATEMENT | | 1 | 101 | 2 (0)| 00:00:01 |
    | 1 | TABLE ACCESS BY INDEX ROWID| T | 1 | 101 | 2 (0)| 00:00:01 |
    |* 2 | INDEX UNIQUE SCAN | IDX_T_UNIID | 1 | | 1 (0)| 00:00:01 |

    Predicate Information (identified by operation id):

    2 - access(“DATA_OBJECT_ID”=1000)
    统计信息

       528 recursive calls
         0 db block gets
        86 consistent gets
        10 physical reads
         0 redo size
      1200 bytes sent via SQL*Net to client
       376 bytes received via SQL*Net from client
         2 SQL*Net roundtrips to/from client
         4 sorts (memory)
         0 sorts (disk)
         1 rows processed
    

    这里,我们看到了Unique Index的一个特性,就是等号操作时执行计划的差异。对Unique Index而言,进行相等查询的结果只有一行值或者没有,所以没必要进行传统的Index Range Scan操作。此处,执行计划中使用的是Index Unique Scan操作,直接精确定位到指定的记录项目,返回rowid记录。

    而一般索引在进行等号检索的时候,通常使用的就是Index Range Scan操作。沿着索引树叶子节点进行水平扫描操作,直到获取索引符合条件索引列值的rowid列表。

    从成本上看,两者虽然执行计划操作方式有一定差别,但是成本实际差异不大。CPU成本和执行时间上相同。各种块读操作(逻辑读和物理读)存在一些差异,笔者认为源于两个索引结构的微量区别,这样读取的块数一定有些差异。

    5、范围搜索实验

    当我们进行索引列的范围搜索时,执行计划和成本有何种差异呢?

    –范围匹配
    SQL> select * from t where object_id>=1000 and object_id<=1500;
    已选择490行。

    执行计划

    Plan hash value: 776407697

    | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

    | 0 | SELECT STATEMENT | | 485 | 48985 | 14 (0)| 00:00:01 |
    | 1 | TABLE ACCESS BY INDEX ROWID| T | 485 | 48985 | 14 (0)| 00:00:01 |
    |* 2 | INDEX RANGE SCAN | IDX_T_NORMALID| 485 | | 3 (0)| 00:00:01 |

    Predicate Information (identified by operation id):

    2 - access(“OBJECT_ID”>=1000 AND “OBJECT_ID”<=1500)

    统计信息

       528 recursive calls
         0 db block gets
       158 consistent gets
        17 physical reads
         0 redo size
     23775 bytes sent via SQL*Net to client
       728 bytes received via SQL*Net from client
        34 SQL*Net roundtrips to/from client
         4 sorts (memory)
         0 sorts (disk)
       490 rows processed
    

    SQL> select * from t where data_object_id>=1000 and data_object_id<=1500;
    已选择490行。

    执行计划

    Plan hash value: 2700411221


    | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

    | 0 | SELECT STATEMENT | | 485 | 48985 | 14 (0)| 00:00:01 |
    | 1 | TABLE ACCESS BY INDEX ROWID| T | 485 | 48985 | 14 (0)| 00:00:01 |
    |* 2 | INDEX RANGE SCAN | IDX_T_UNIID | 485 | | 3 (0)| 00:00:01 |

    Predicate Information (identified by operation id):

    2 - access(“DATA_OBJECT_ID”>=1000 AND “DATA_OBJECT_ID”<=1500)

    统计信息

       528 recursive calls
         0 db block gets
       157 consistent gets
        16 physical reads
         0 redo size
     23775 bytes sent via SQL*Net to client
       728 bytes received via SQL*Net from client
        34 SQL*Net roundtrips to/from client
         4 sorts (memory)
         0 sorts (disk)
       490 rows processed
    

    从实验结果看,两者在进行范围搜索时,执行计划没有差异。两者都是进行Index Range Scan操作。各类型成本基本相同。

    6、结论

    本篇主要从应用角度,分析Unique Index与一般normal Index的差异。从结果看,Unique Index就是额外添加的唯一性约束。该约束严格的保证索引列的取值唯一性,这在一些数据列上的业务约束实现是很重要的功能。比如一个数据列,不能作为主键,而且允许为空,但是业务上要求唯一特性。这时候使用唯一性索引就是最好的选择。

    从执行计划where条件中的表现看,Unique Index和一般normal Index没有显著性的差异。

    两者数据基础值一样的情况下,生成索引的体积存在略微的差异,说明在存储结构上两者可能有不同。下面我们来分析一下两类型索引的结构信息。

    展开全文
  • 索引是我们经常使用的一种数据库搜索优化手段。适当的业务操作场景使用适当的索引方案可以显著的提升...唯一索引unique index和一般索引normal index最大的差异就是在索引列上增加了一层唯一约束。添加唯一性索...

    索引是我们经常使用的一种数据库搜索优化手段。适当的业务操作场景使用适当的索引方案可以显著的提升系统整体性能和用户体验。在Oracle中,索引有包括很多类型。不同类型的索引适应不同的系统环境和访问场景。其中,唯一性索引Unique Index是我们经常使用到的一种。

     

    唯一性索引unique index和一般索引normal index最大的差异就是在索引列上增加了一层唯一约束。添加唯一性索引的数据列可以为空,但是只要存在数据值,就必须是唯一的。

     

    那么,在使用唯一性索引时,同一般索引有什么差异呢?下面通过一系列的演示实验来说明。

     

    1、实验环境准备

     

    为了体现出一致性和可能的差异性,选择相同的数据值列加入不同类型的索引结构。

     

     

    SQL> select * from v$version where rownum<2;

    BANNER

    --------------------------------------------------------------------------------

    Oracle Database11gEnterpriseEdition Release11.2.0.1.0 - Production

     

    SQL> create table t as select * from dba_objects;

    Table created

     

    //保证data_object_idobject_id取值相同;

    SQL> update t set data_object_id=object_id;

    72581 rows updated

     

    SQL> commit;

    Commit complete

     

    //普通索引

    SQL> create index idx_t_normalid on t(object_id);

    Index created

     

    //唯一性索引

    SQL> create unique index idx_t_uniid on t(data_object_id);

    Index created

     

    SQL> exec dbms_stats.gather_table_stats(user,'T',cascade => true);

    PL/SQL procedure successfully completed

     

     

     

    2、体积容量比较

     

    在环境准备中,我们将索引列取值设置为完全相同,尽量避免由于外在原因引起的差异。下面我们检查数据字典中的容量比较信息。

     

    首先是查看索引段index segment信息。

     

     

    SQL> select segment_name, segment_type, bytes, blocks, extents from dba_segments where segment_name in ('IDX_T_NORMALID','IDX_T_UNIID');

     

    SEGMENT_NAME        SEGMENT_TYPE        BYTES    BLOCKS EXTENTS

    -------------------- ------------------ ---------- ---------- ----------

    IDX_T_NORMALID      INDEX                 983040       120        15

    IDX_T_UNIID           INDEX                 917504       112        14

     

     

    一般索引normal index较唯一性索引空间消耗略大。索引idx_t_normalid占据15个分区,120block。略大于idx_t_uniid14个分区块。

     

    这个地方需要注意一下,在数据字典中一个segment的分区占据,是Oracle系统分配给的空间,并不意味着全部使用殆尽。可能两个索引结构差异很小,但是额外多分配出一个extent

     

    索引叶子结构上,检查数据字典内容。

     

     

    SQL> select index_name, index_type, UNIQUENESS, BLEVEL, LEAF_BLOCKS, DISTINCT_KEYS from dba_indexes where index_name in ('IDX_T_NORMALID','IDX_T_UNIID');

     

    INDEX_NAME          INDEX_TYPE     UNIQUENESS    BLEVEL LEAF_BLOCKS DISTINCT_KEYS

    -------------------- --------------- ---------- ---------- ----------- -------------

    IDX_T_UNIID         NORMAL         UNIQUE             1        106        51330

    IDX_T_NORMALID      NORMAL         NONUNIQUE          1        113        51330

     

     

    两者的差异不大,normal index空间消耗要略大于unique index

     

    结论:从数据字典反映出的情况可以知道,同一般索引相比,唯一性索引的空间消耗略小一些。由于我们采用的实验数据都是相同的,这一点点的差距可能就意味着两种索引类型在存储结构上存在略微的差异。

     

     

    3、违反约束实验

     

    作为唯一性索引,在添加创建和进行dml操作的时候,都会严格发挥出约束的作用。

     

    SQL> insert into t select * from t where rownum<2;

     

    insert into t select * from t where rownum<2

     

    ORA-00001:违反唯一约束条件(SYS.IDX_T_UNIID)

     

     

     

    4、等号检索实验

     

    当我们进行等号查询的时候,Oracle对两种索引生成的执行计划有何种差异?注意:下面的select检索之前,都使用flush语句对shared_poolbuffer_cache进行清理。

     

     

    --精确查询

    SQL> select * from t where object_id=1000;

    执行计划

    ----------------------------------------------------------

    Plan hash value: 776407697

    ----------------------------------------------------------------------------------------------

    | Id | Operation                  | Name          | Rows | Bytes | Cost (%CPU)| Time    |

    ----------------------------------------------------------------------------------------------

    |  0 | SELECT STATEMENT           |               |    1 |  101 |    2  (0)| 00:00:01 |

    |  1 | TABLE ACCESS BY INDEX ROWID| T             |    1 |  101 |    2  (0)| 00:00:01 |

    |* 2 |  INDEX RANGE SCAN         | IDX_T_NORMALID |    1 |      |    1  (0)| 00:00:01 |

    ----------------------------------------------------------------------------------------------

    Predicate Information (identified by operation id):

    ---------------------------------------------------

      2 - access("OBJECT_ID"=1000)

    统计信息

    ----------------------------------------------------------

           528 recursive calls

             0 db block gets

            87 consistent gets

            11 physical reads

             0 redo size

          1200 bytes sent via SQL*Net to client

           376 bytes received via SQL*Net from client

             2 SQL*Net roundtrips to/from client

             4 sorts (memory)

             0 sorts (disk)

             1 rows processed

     

    SQL> select * from t where data_object_id=1000;

     

    执行计划

    ----------------------------------------------------------

    Plan hash value: 335537167

     

    -------------------------------------------------------------------------------------------

    | Id | Operation                  | Name       | Rows | Bytes | Cost (%CPU)| Time    |

    -------------------------------------------------------------------------------------------

    |  0 | SELECT STATEMENT           |            |    1 |  101 |    2  (0)| 00:00:01 |

    |  1 | TABLE ACCESS BY INDEX ROWID| T          |    1 |  101 |    2  (0)| 00:00:01 |

    |* 2 |  INDEX UNIQUE SCAN        | IDX_T_UNIID |    1 |      |    1  (0)| 00:00:01 |

    -------------------------------------------------------------------------------------------

    Predicate Information (identified by operation id):

    ---------------------------------------------------

      2 - access("DATA_OBJECT_ID"=1000)

    统计信息

    ----------------------------------------------------------

           528 recursive calls

             0 db block gets

            86 consistent gets

            10 physical reads

             0 redo size

          1200 bytes sent via SQL*Net to client

           376 bytes received via SQL*Net from client

             2 SQL*Net roundtrips to/from client

             4 sorts (memory)

             0 sorts (disk)

             1 rows processed

     

     

    这里,我们看到了Unique Index的一个特性,就是等号操作时执行计划的差异。对Unique Index而言,进行相等查询的结果只有一行值或者没有,所以没必要进行传统的Index Range Scan操作。此处,执行计划中使用的是Index Unique Scan操作,直接精确定位到指定的记录项目,返回rowid记录。

     

    而一般索引在进行等号检索的时候,通常使用的就是Index Range Scan操作。沿着索引树叶子节点进行水平扫描操作,直到获取索引符合条件索引列值的rowid列表。

     

    从成本上看,两者虽然执行计划操作方式有一定差别,但是成本实际差异不大。CPU成本和执行时间上相同。各种块读操作(逻辑读和物理读)存在一些差异,笔者认为源于两个索引结构的微量区别,这样读取的块数一定有些差异。

     

     

    5、范围搜索实验

     

    当我们进行索引列的范围搜索时,执行计划和成本有何种差异呢?

     

     

    --范围匹配

    SQL> select * from t where object_id>=1000 and object_id<=1500;

    已选择490行。

     

    执行计划

    ----------------------------------------------------------

    Plan hash value: 776407697

    ----------------------------------------------------------------------------------------------

    | Id | Operation                  | Name          | Rows | Bytes | Cost (%CPU)| Time    |

    ----------------------------------------------------------------------------------------------

    |  0 | SELECT STATEMENT           |               |  485 | 48985 |   14  (0)| 00:00:01 |

    |  1 | TABLE ACCESS BY INDEX ROWID| T             |  485 | 48985 |   14  (0)| 00:00:01 |

    |* 2 |  INDEX RANGE SCAN         | IDX_T_NORMALID|  485 |      |    3  (0)| 00:00:01 |

    ----------------------------------------------------------------------------------------------

    Predicate Information (identified by operation id):

    ---------------------------------------------------

      2 - access("OBJECT_ID">=1000 AND "OBJECT_ID"<=1500)

     

    统计信息

    ----------------------------------------------------------

           528 recursive calls

             0 db block gets

           158 consistent gets

            17 physical reads

             0 redo size

         23775 bytes sent via SQL*Net to client

           728 bytes received via SQL*Net from client

            34 SQL*Net roundtrips to/from client

             4 sorts (memory)

             0 sorts (disk)

           490 rows processed

     

     

    SQL> select * from t where data_object_id>=1000 and data_object_id<=1500;

    已选择490行。

     

    执行计划

    ----------------------------------------------------------

    Plan hash value: 2700411221

     

    -------------------------------------------------------------------------------------------

    | Id | Operation                  | Name       | Rows | Bytes | Cost (%CPU)| Time    |

    -------------------------------------------------------------------------------------------

    |  0 | SELECT STATEMENT           |            |  485 | 48985 |   14  (0)| 00:00:01 |

    |  1 | TABLE ACCESS BY INDEX ROWID| T          |  485 | 48985 |   14  (0)| 00:00:01 |

    |* 2 |  INDEX RANGE SCAN         | IDX_T_UNIID |  485 |      |    3  (0)| 00:00:01 |

    -------------------------------------------------------------------------------------------

    Predicate Information (identified by operation id):

    ---------------------------------------------------

      2 - access("DATA_OBJECT_ID">=1000 AND "DATA_OBJECT_ID"<=1500)

     

    统计信息

    ----------------------------------------------------------

           528 recursive calls

             0 db block gets

           157 consistent gets

            16 physical reads

             0 redo size

         23775 bytes sent via SQL*Net to client

           728 bytes received via SQL*Net from client

            34 SQL*Net roundtrips to/from client

             4 sorts (memory)

             0 sorts (disk)

           490 rows processed

     

     

     

    从实验结果看,两者在进行范围搜索时,执行计划没有差异。两者都是进行Index Range Scan操作。各类型成本基本相同。

     

     

    6、结论

     

    本篇主要从应用角度,分析Unique Index与一般normal Index的差异。从结果看,Unique Index就是额外添加的唯一性约束。该约束严格的保证索引列的取值唯一性,这在一些数据列上的业务约束实现是很重要的功能。比如一个数据列,不能作为主键,而且允许为空,但是业务上要求唯一特性。这时候使用唯一性索引就是最好的选择。

     

    从执行计划where条件中的表现看,Unique Index和一般normal Index没有显著性的差异。

     

     

    两者数据基础值一样的情况下,生成索引的体积存在略微的差异,说明在存储结构上两者可能有不同。下面我们来分析一下两类型索引的结构信息。

    原文地址:https://www.cnblogs.com/sarahc/articles/2112891.html

    转载于:https://www.cnblogs.com/jpfss/p/11121011.html

    展开全文
  • 创建Primary key主键和Unique唯一索引

    千次阅读 2016-10-28 11:54:59
    在MySQL中,我们进行数据存储时,为了避免插入重复数据,常常通过给数据表添加主键或者索引的方法来解决,在插入过程中,如果遇到重复数据就会提示“uplicate entry 'D550-49' for key 'cv_series'”的错误,防止...
  • sql 删除唯一索引unique

    千次阅读 2020-09-24 10:46:13
    mysql 删除唯一约束unique 比如,表bank中的字段user_id有约束unique唯一索引),但是我们现在不需要这个约束了,想删除user_id的unique,下面的sql语句可以实现: alter table bank drop index user_id;
  • 当表有多个索引的时候,不同的事务可以使用不同的索引锁定不同的行,另外,不论是使用主键索引、唯一索引或普通索引,InnoDB都会使用行锁来对数据加锁。 MySQL中锁详解(行锁、表锁、页锁、悲观锁、乐观锁等) ...
  • SQLServer索引管理——唯一索引和唯一约束的区别 唯一索引保证在索引键列中的值是唯一的 唯一约束保证没有重复值被插入到列中,当该列上创建有唯一约束的时候。当列上创建了唯一约束时,对应的会在该列自动创建...
  • 如果在一个列上同时建唯一索引和普通索引的话,mysql会自动选择唯一索引。 -- 创建唯一索引 CREATE UNIQUE INDEX uk_...注意:唯一索引对null不起作用,也就是字段为null的话可以重复; 注意:唯一索引对" “不起作...
  • mysql唯一索引unique

    万次阅读 2016-05-28 19:10:31
    唯一索引可以对多个列都做,并且它是可以为空的,它虽然叫做索引,但是它主要是用来防止某些列的重复的,而不是专门用来查找的,所以和普通的索引的效率差别????(等我知道了再解释~) 最后附上这次实验的...
  •  也有两个作用,一是约束作用(constraint),规范数据的唯一性,但同时也在这个key上建立了一个唯一索引UNIQUE 约束:唯一标识数据库表中的每条记录。  UNIQUE 和 PRIMARY KEY 约束均为列或列集合...
  • 唯一索引(UNIQUE) 聚集索引(CLUSTERED) 非聚集索引(NONCLUSTERED) 唯一索引(UNIQUE) 聚集索引(CLUSTERED) 非聚集索引(NONCLUSTERED) 唯一索引(UNIQUE) 聚集索引(CLUSTERED) 非聚集索引...
  • REPLACE INTO语句和唯一索引UNIQUE INDEX

    千次阅读 2020-03-02 11:56:43
    因为通常我们将id设为主键,而id通常具有不可重复的特性,所以我们一般会使用唯一索引来限制数据表中的数据,例如:我们不想存有重复电话号码的数据信息,我们可以将电话号码这个字段设置为唯一索引,这样一来如果...
  • 设置其他 设置 ...2、选则 索引 3、选择栏位,输入名,选择索引类型,选择索引方法 ...继续添加索引:重复第 3 步,第 4 步 5、ctrl + s 保存 ...Mysql唯一索引和普通索引的区别 mysql的索引方法btree和hash的区别 ...
  • mysql中字段唯一索引unique

    万次阅读 2018-02-23 11:33:57
    1.增加 alter table trans_push_task ...增加过后查看索引,新建查询。 show INDEX from trans_push_task; 或者 show keys FROM trans_push_task; 查询结果(只列出几个重要的): Table Non_unique ...
  • 如果在一个列上同时建唯一索引和普通索引的话,mysql会自动选择唯一索引。 谷歌一下: 唯一索引和普通索引使用的结构都是B-tree,执行时间复杂度都是O(log n)。 补充下概念:1、普通索引(非唯一索引) 普通索引(由...
  • 别踩坑!使用MySQL唯一索引请注意

    万次阅读 多人点赞 2019-01-28 21:33:14
    背景 在程序设计中了,我们往往需要...但是我们不能确保同时有两个人使用同一个手机号注册到我们的系统中,因此这里就需要在更深的层次去确保手机号的唯一性了。不同存储方案,解决方式不一样,这里以MySQL为例,我...
  • Mysql唯一索引Unique Index)

    千次阅读 2019-06-19 20:07:11
     普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度。因此,应该只为那些最经常出现在查询条件(WHEREcolumn=)或排序条件(ORDERBYcolumn)中的数据列创建索引。只要有可能,就应该选择...
  • 创建unique时,约束和索引有何区别 唯一约束和唯一索引区别,选项 忽略重复键 作用
  • 主键一定是唯一索引唯一索引并不一定就是主键。 所谓主键就是能够唯一标识表中某一行的属性或属性组,一个表只能有一个主键,但可以有多个候选索引。 因为主键可以唯一标识某一行记录,所以可以确保执行数据...
  • 如果在一个列上同时建唯一索引和普通索引的话,mysql会自动选择唯一索引。 谷歌一下: 唯一索引和普通索引使用的结构都是B-tree,执行时间复杂度都是O(log n)。 补充下概念: 1、普通索引    ...
  • school表名要使用tab上面按键的符号 code:为加入索引的字段 alter table `school` add unique (`code`);
  • MySQL创建和删除唯一索引(unique key)

    千次阅读 2019-08-31 17:42:40
    创建unique索引 alter table test add unique index (`key`); 删除key键unique索引 alter table test drop index `key`;
  • 主要介绍了Laravel Validator 两个或多个字段联合索引唯一,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 117,569
精华内容 47,027
关键字:

unique唯一索引的作用