精华内容
下载资源
问答
  • 理论文章会告诉你值重复率高的字段不适合建索引。不要说性别字段只有两个值,网友亲测,一个字段使用拼音首字母做值,共有26种可能,加上索引后,百万加的数据量,使用索引的速度比不使用索引要慢! 一个表可能会...

    理论文章会告诉你值重复率高的字段不适合建索引。不要说性别字段只有两个值,网友亲测,一个字段使用拼音首字母做值,共有26种可能,加上索引后,百万加的数据量,使用索引的速度比不使用索引要慢!

    一个表可能会涉及两个数据结构(文件),一个是表本身,存放表中的数据,另一个是索引。索引是什么?它就是把一个或几个字段(组合索引)按规律排列起来,再附上该字段所在行数据的物理地址(位于表中)。比如我们有个字段是年龄,如果要选取某个年龄段的所有行,那么一般情况下可能需要进行一次全表扫描。但如果以这个年龄段建个索引,那么索引中会按年龄值建一个排列,这样在索引中就能迅速定位,不需要进行全表扫描。

    为什么性别不适合建索引呢?因为你访问索引需要付出额外的IO开销,你从索引中拿到的只是地址,要想真正访问到数据还是要对表进行一次IO。假如你要从表的100万行数据中取几个数据,那么利用索引迅速定位,访问索引的这IO开销就非常值了。但如果你是从100万行数据中取50万行数据,就比如性别字段,那你相对需要访问50万次索引,再访问50万次表,加起来的开销并不会比直接对表进行一次完整扫描小。
     

    展开全文
  • 理论文章会告诉你值重复率高的字段不适合建索引。不要说性别字段只有两个值,网友亲测,一个字段使用拼音首字母做值,共有26种可能,加上索引后,百万加的数据量,使用索引的速度比不使用索引要慢! 一个表可能会...

    理论文章会告诉你值重复率高的字段不适合建索引。不要说性别字段只有两个值,网友亲测,一个字段使用拼音首字母做值,共有26种可能,加上索引后,百万加的数据量,使用索引的速度比不使用索引要慢!

    一个表可能会涉及两个数据结构(文件),一个是表本身,存放表中的数据,另一个是索引。索引是什么?它就是把一个或几个字段(组合索引)按规律排列起来,再附上该字段所在行数据的物理地址(位于表中)。比如我们有个字段是年龄,如果要选取某个年龄段的所有行,那么一般情况下可能需要进行一次全表扫描。但如果以这个年龄段建个索引,那么索引中会按年龄值建一个排列,这样在索引中就能迅速定位,不需要进行全表扫描。

    为什么性别不适合建索引呢?因为你访问索引需要付出额外的IO开销,你从索引中拿到的只是地址,要想真正访问到数据还是要对表进行一次IO。假如你要从表的100万行数据中取几个数据,那么利用索引迅速定位,访问索引的这IO开销就非常值了。但如果你是从100万行数据中取50万行数据,就比如性别字段,那你相对需要访问50万次索引,再访问50万次表,加起来的开销并不会比直接对表进行一次完整扫描小。同时,虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行 INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据还要更新索引。建立索引会占用磁盘空间。一般情 况这个问题不太严重,但如果你在一个大表上创建了多种组合索引,索引文件的会膨胀很快。

    当然凡事不是绝对,如果把性别字段设为表的聚集索引,那么就肯定能加快大约一半该字段的查询速度了。聚集索引指的是表本身中数据按哪个字段的值来进行排序。因此,聚集索引只能有一个,而且使用聚集索引不会付出额外IO开销。当然你得能舍得把聚集索引这么宝贵资源用到性别字段上。

    参考文章:

    https://www.cnblogs.com/sunxi/p/4011592.html

    http://www.cnblogs.com/Lovepanda/archive/2010/03/24/MySql.html
    --------------------- 
    作者:大狗狗 
    来源:CSDN 
    原文:https://blog.csdn.net/Win32FanEx/article/details/79513857 
    版权声明:本文为博主原创文章,转载请附上博文链接!

    展开全文
  • GO 解决方案1: 对于这个问题,大家的第一个想法可能是:在Caption这个字段上面加一个唯一键不就可以了吗?好,我们按着这个思路做下去,先创建唯一索引。 代码如下: CREATE UNIQUE NONCLUSTERED INDEX un_test_tb ...
  • a、非聚簇索引存储了对主键的引用,如果select字段不在非聚簇索引内,就需要跳到主键索引(上图中从右边的索引树跳到左边的索引树),再获取select字段值 b、如果非聚簇索引重复率高,那么查询时就会大量出现上图...

     

     结论(以innodb为例)

    a、非聚簇索引存储了对主键的引用,如果select字段不在非聚簇索引内,就需要跳到主键索引(上图中从右边的索引树跳到左边的索引树),再获取select字段值

    b、如果非聚簇索引值重复率高,那么查询时就会大量出现上图中从右边跳到左边的情况,导致整个流程很慢

    c、如果where值重复率高的字段,select用了limit,只查较少数据,也就是跳的次数很少的情况下,还是可以建索引的(后来想想也没必要,limit限制了数量,全表扫描也很快,除非字段值是排序的,必须扫描完前面的所有值)

    d、如果没有3这个前提,则不建议在值重复率高的字段上建索引,因为查询效率低,还需要维护索引

    展开全文
  • SQLServer索引优化——重复索引(部分重复) 前文给出了查询完全重复索引方法,但更多的情况下,是多个管理员,根据单个或部分查询,创建其各自需要的索引,而没有考虑整体情形,就会出现大量的部分重复索引,这对...

    SQL Server 索引优化——重复索引(部分重复)

    前文给出了查询完全重复索引方法,但更多的情况下,是多个管理员,根据单个或部分查询,创建其各自需要的索引,而没有考虑整体情形,就会出现大量的部分重复索引,这对OLAP来说没有较大的影响,但对于OLTP系统,频繁的数据变更就会造成大量的性能消耗,同时也会增加存储的压力。所以对于这部分的索引的优化也显得非常有重要。我们可以这样理解部分重复索引,即同一列(或列集,不包含聚集索引的键列)在不同索引的第一键列(第二、第三……)中重复出现,其他部分不同。部分重复索引的构成比较复杂,没有办法给出统一脚本,只能通过一个个简单的例子进行说明。

    先创建测试表,脚本如下:

    CREATE TABLE Member
    (
           MemberNo INT IDENTITY,
           FirstName VARCHAR(30) NOT NULL,
           LastName VARCHAR(30) NOT NULL,
           RegionNo INT
    );

    为说明这个问题,下面考虑两个查询,并单独创建各自需要的索引。

    SELECT
           LastName
    FROM Member
    WHERE FirstName='jack';
    CREATE INDEX MemberIndex1
    ON Member(FirstName)
    INCLUDE(LastName);
    GO

    CREATE INDEX MemberIndex2
    ON Member(FirstName)
    INCLUDE(RegionNo);
    GO
    SELECT
           RegionNo
    FROM Member
    WHERE FirstName='jack';

    可以看到MemberIndex1、MemberIndex2的键列均为FirstName,而前者的包含列为LastName,后者的包含列为RegionNo。因为包含列中的顺序不会影响查询优化器对索引的使用,所以可以这样消除重复索引,我们删除索引MemberIndex2,重建索引MemberIndex1,包含列同时包含原两个索引包含列中的LastName和RegionNo,脚本如下:

    DROP INDEX Member.MemberIndex2;
    CREATE INDEX MemberIndex1 ON Member(FirstName)
    INCLUDE(LastName,RegionNo)
    WITH (DROP_EXISTING=ON);

    重建索引后,再次执行两个查询,查看它们的执行计划如下:

    可以看到两个查询都使用新的索引进行索引查找。这样我们节省了一个索引维护的开销,同时减少了索引中重复字段的存储空间。

    部分重复索引可能不尽相同,如有兴趣,欢迎讨论。

    如果喜欢,可以搜索关注 MSSQLServer 公众号,将有更多精彩内容分享:

                                                                     

    展开全文
  • mysql给表格字段设置唯一性索引

    千次阅读 2019-01-15 10:43:27
    在建表时设置 CREATE TABLE 't_user' ( `Id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(18) NOT NULL unique, `password` varchar(18) NOT NULL, PRIMARY KEY (`Id`) ) ENGINE=InnoDB AUTO_INCREMENT=...
  • 数据库字段属性和索引

    千次阅读 2019-07-05 23:30:25
    主键:primary key ,主要的键,一张表只能一个字段可以使用对应的键,用来唯一的约束该字段里面的数据,不能重复,这种称之为主键。 1.增加主键 SQL操作中多种方式可以给表增加主键:大体分为三种 方案1:在...
  • 理论文章会告诉你值重复率高的字段不适合建索引。不要说性别字段只有两个值,网友亲测,一个字段使用拼音首字母做值,共有26种可能,加上索引后,百万加的数据量,使用索引的速度比不使用索引要慢! 一个表可能会...
  • sql 表中同一个字段已经创建了单字段索引还能在字段创建组合索引吗?
  • MySQL给某个字段添加索引

    千次阅读 2020-06-03 17:57:42
    一张表只能一个主键索引,再次添加会报重复主键: 2、为cht_apps表的META_NAME字段添加唯一索引(UNIQUE): ALTER TABLE cht_apps ADD UNIQUE (META_NAME) 执行结果: 表结构: 3、为cht_apps表的META_...
  • Oracle 19c和Oracle11g字段重复多加唯一联合索引的区别 ** Oracle19c遇到字段重复率比较高,利用主键和字段创建唯一联合索引,查询执行计划会走索引: 我们来看Oracle11g,同样创建唯一联合索引,11g版本就不会走索...
  • 会发现随着表中记录的增多,查询的速度也会也来越慢,特别是那种日志记录,少则几十万,多则上百万,甚至上千万数据,如果查询一次耗时太长,会严重影响业务逻辑,这时候可以考虑给经常作为条件的字段添加索引了...
  • oracle中多个字段组成唯一索引约束

    千次阅读 2018-11-26 18:59:02
    已经验证!!!欢迎相互学习交流 --原来EXPENSE_ITEM_CODE, EXPENSE_TYPE_CODE, EXP_REPORT_TYPE_CODE这三个为唯一索引...注意事项(报错dupplicate keys found,若表中要创建的唯一索引约束的四个字段在数据库该表...
  • 重复索引与冗余索引

    千次阅读 2017-03-16 20:28:11
    重复索引:表示一个列或者顺序相同的几个列上建立的多个索引。 冗余索引:两个索引所覆盖的列重叠冗余索引在一些特殊的场景下使用到了索引覆盖,所以比较快。场景比如文章与标签表 +——+——-+——+ | id | ...
  • 转自: ...MySQL命令行中(5.6) ALTER TABLE dbname.table ADD UNIQUE (fieldname); 数据库名为dbname,表名table,字段名fieldname. ------------------------------------------------...
  • mysql多字段唯一索引

    千次阅读 2018-07-27 16:58:00
    项目中需要用到联合...例如:user表中userID,userName两个字段,如果不希望2条一模一样的记录,需要给user表添加多个字段的联合唯一索引: alter table user add nuique index(user_id,user_name); 例如: alte...
  • 我常用的一些SQLServer中操作表,字段索引的SQL语句,Post到这里,留作备忘录。 LastUpdate: 2012-12-31 -- 创建表,带主键 CREATE TABLE 新表名( [fID] [int] IDENTITY(1,1) NOT NULL, [fa] [int] NULL, [fb] ...
  • 性别字段建立索引问题

    万次阅读 2018-09-25 18:32:35
    性别字段这种重复性很强的字段,不要建立索引。为什么不能呢? 下面建立表测试下。如:我建了个tb_test表,往里面插入了七百多万数据,先给性别建立索引,查询开启 sql运行时间记录。 创建名为tb_index_test 的...
  • 如何给字符串字段索引

    千次阅读 2019-10-31 17:15:16
    如果这样一个场景,某个字段保存的是邮箱,然后需要给这个字段建立索引如下几种解决方案: 全字段索引 alter table user add index index1(email); 不建议用这种方式,因为索引树需要存储字段的全部值造成...
  • MySQL中大数据表增加字段,通过增加索引实现 普通的添加字段sql ALTER TABLE `table_name` ADD COLUMN `num` int(10) NOT NULL DEFAULT 0 AFTER `addtime`; 普通的添加索引sql ALTER TABLE `table_name` ...
  • 只有字段的个数少了,才能说明在系统中不存在数据重复,且很少数据冗   余,更重要的是督促读者学会“列变行”,这样就防止了将子表中的字段拉入到主表中去,在主表中留下许   多空余的字段。所谓“列变行...
  • 1、打开你想要设计的表 2.设计哪个字段为唯一的,如我这里...字段:想要设计的那个UNIQUE字段名,这里可以选择,也可以直接输入 索引类型:当然是选择UNIQUE啦 索引方法:可以不写,默认如图 注释:就是注释啦** ...
  • 今天遇到一个DB2的问题:两条同样的SQL语句,只是where条件指定的字段的值不一样,结果访问计划中,一条SQL走了索引,另一条没有,类似如下: SQL1: select id, name from t1 where id = 3000 and .... -&gt...
  • 请教一个让我不解的问题...在我的概念里,重复率高的字段是肯定不适合建B树索引的,强制使用B树索引反而会因为增加索引开销,比全表扫描还要慢些。所以请教各位高手,在COL1字段上建B树索引为什么可以起到这样的效果?
  • 目录 前言: 1. 实例分析 1.1 如何创建循环函数 1.2 进行查询操作 2. 索引选择 2.1 优化器 ...2.3 Mysql怎么得到索引的基数的呢?...2.4 选错索引的原因?...2.4.2 为什么选错了索引?...3. 选错索引,处理方...
  • navicat for mysql 如何设置字段唯一

    万次阅读 2018-04-08 19:00:25
    建立了一个数据表,其中一个字段不是主键,但在存数据的时候又不想让它有重复的值。若建表是用create table{****}命令,可以设置字段的属性如:字段名 not null unique即可。我建表用的是Navicat,该方法下记录。 ...
  • 现在,几乎所有的系统都支持邮箱登录,如何在邮箱这样的字段上建立合理的索引,是我们今天要讨论的问题。假设,你现在维护一个支持邮箱登录的系统,用户表是这么定义的:mysql> create table SUser( ID bigint ...
  • /* 添加字段 */ DELIMITER $$ DROP PROCEDURE IF EXISTS `add_column` $$ CREATE PROCEDURE add_column() BEGIN IF NOT EXISTS( SELECT * FROM information_schema.columns WHERE table_schema='dbName' AND table_...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 210,895
精华内容 84,358
关键字:

如何设置字段有重复索引