精华内容
下载资源
问答
  • 理论文章会告诉你值重复率高的字段不适合建索引。不要说性别字段只有两个值,网友亲测,一个字段使用拼音首字母做值,共有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 
    版权声明:本文为博主原创文章,转载请附上博文链接!

    展开全文
  • MySQL之索引:索引字段的选取

    千次阅读 2017-09-13 19:53:20
    日常在建数据表的时候,通常会在WHERE,GROUP BY,ORDER BY等常用的... 这里建立一张数据表,有staff_id和leader_id两个字段,通过EXPLAIN分析可以验证哪个字段更适合做索引。CREATE TABLE `test_index_distinct...

            日常在建数据表的时候,通常会在WHERE,GROUP BY,ORDER BY等常用的字段上建立索引,当有多个字段时候,有一项原则就是该字段的去重后的值个数越多,索引建立的必要性越强。

            这里建立一张数据表,有staff_id和leader_id两个字段,通过EXPLAIN分析可以验证哪个字段更适合做索引。

    CREATE TABLE `test_index_distinct_value` (
      `Id` int(11) NOT NULL AUTO_INCREMENT,
      `staff_id` int(11) DEFAULT NULL,
      `leader_id` int(11) DEFAULT NULL,
      `remark` varchar(255) DEFAULT NULL,
      PRIMARY KEY (`Id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

    插入若干条数据:


    通过一条SQL先对比下staff_id和leader_id去重后的值个数与总行数的占比:

    SELECT COUNT(DISTINCT(staff_id))/COUNT(*) AS staff_rate,
           COUNT(DISTINCT(leader_id))/COUNT(*) AS leader_rate
    FROM test_index_distinct_value

    查找结果:

    可以看到去重后的数值staff_id要高于leader_id的个数。

    下面先在staff_id字段上建立索引,用EXPLAIN分析一条普通的查询SQL语句:

    EXPLAIN
    SELECT *
    FROM test_index_distinct_value
    WHERE leader_id=2 AND staff_id=22


    拆除staff_id字段上的索引,在leader_id字段上建立,继续用EXPLAIN分析分析上条查询SQL语句:



            可以看出同样使用了索引查找执行同样的SQL语句,在leader_id字段上建立的索引需要扫描3行数据,而在staff_id字段建立索引时,仅需扫描1行数据,验证可去重后数值越多索引效率越高。

            当然这个原则仅仅是作为一项参考,具体的还需要跟对应业务相结合。




    展开全文
  • 哪些字段不适合建立索引

    万次阅读 2019-02-15 14:03:17
    https://blog.csdn.net/WuLex/article/details/69540136
    展开全文
  • 那些字段适合建索引

    万次阅读 2017-04-07 16:39:18
    数据库建立索引常用的规则如下:1、表的主键、外键必须有索引; 2、数据量超过300的表应该有...6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引; 7、复合索引的建立需要进行仔细分析;尽量考虑

    数据库建立索引常用的规则如下:

    1、表的主键、外键必须有索引;
    2、数据量超过300的表应该有索引;
    3、经常与其他表进行连接的表,在连接字段上应该建立索引;
    4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;
    5、索引应该建在选择性高的字段上;
    6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;
    7、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:

    A、正确选择复合索引中的主列字段,一般是选择性较好的字段;

    B、复合索引的几个字段是否经常同时以AND方式出现在Where子句中?单字段查询是否极少甚至没有?如果是,则可以建立复合索引;否则考虑单字段索引;

    C、如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引;

    E、如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;

    8、频繁进行数据操作的表,不要建立太多的索引;
    9、删除无用的索引,避免对执行计划造成负面影响;

    以上是一些普遍的建立索引时的判断依据。
    索引的建立必须慎重,对每个索引的必要性都应该经过仔细分析,要有建立的依据。
    因为太多的索引与不充分、不正确的索引对性能都毫无益处:在表上建立的每个索引都会增加存储开销,索引对于插入、删除、更新操作也会增加处理上的开销。 另外,过多的复合索引,在有单字段索引的情况下,一般都是没有存在价值的;相反,还会降低数据增加删除时的性能,特别是对频繁更新的表来说,负面影响更大。
    总的来说,小型表肯定不建索引,
    或者数据库记录在亿条数据级以上,还是建议使用非关系型数据库。
    还有些特殊字段的数据库,比如BLOB,CLOB字段肯定也不适合建索引。
    其实这个问题更感觉偏向于做软件项目的一种经验。


    对千万级MySQL数据库建立索引的事项及提高性能的手段

    一、注意事项:

    首先,应当考虑表空间和磁盘空间是否足够。我们知道索引也是一种数据,在建立索引的时候势必也会占用大量表空间。因此在对一大表建立索引的时候首先应当考虑的是空间容量问题。
    其次,在对建立索引的时候要对表进行加锁,因此应当注意操作在业务空闲的时候进行。

    二、性能调整方面:

    首当其冲的考虑因素便是磁盘I/O。物理上,应当尽量把索引与数据分散到不同的磁盘上(不考虑阵列的情况)。逻辑上,数据表空间与索引表空间分开。这是在建索引时应当遵守的基本准则。

    其次,我们知道,在建立索引的时候要对表进行全表的扫描工作,因此,应当考虑调大初始化参数db_file_multiblock_read_count的值。一般设置为32或更大。

    再次,建立索引除了要进行全表扫描外同时还要对数据进行大量的排序操作,因此,应当调整排序区的大小。

    9i之前,可以在session级别上加大sort_area_size的大小,比如设置为100m或者更大。

    9i以后,如果初始化参数workarea_size_policy的值为TRUE,则排序区从pga_aggregate_target里自动分配获得。

    最后,建立索引的时候,可以加上nologging选项。以减少在建立索引过程中产生的大量redo,从而提高执行的速度。

    MySql在建立索引优化时需要注意的问题

    设计好MySql的索引可以让你的数据库飞起来,大大的提高数据库效率。设计MySql索引的时候有一下几点注意:

    1,创建索引

    对于查询占主要的应用来说,索引显得尤为重要。很多时候性能问题很简单的就是因为我们忘了添加索引而造成的,或者说没有添加更为有效的索引导致。如果不加索引的话,那么查找任何哪怕只是一条特定的数据都会进行一次全表扫描,如果一张表的数据量很大而符合条件的结果又很少,那么不加索引会引起致命的性能下降。但是也不是什么情况都非得建索引不可,比如性别可能就只有两个值,建索引不仅没什么优势,还会影响到更新速度,这被称为过度索引。

    2,复合索引

    比如有一条语句是这样的:select * from users where area=’beijing’ and age=22;
    如果我们是在area和age上分别创建单个索引的话,由于mysql查询每次只能使用一个索引,所以虽然这样已经相对不做索引时全表扫描提高了很多效
    率,但是如果在area、age两列上创建复合索引的话将带来更高的效率。如果我们创建了(area, age,
    salary)的复合索引,那么其实相当于创建了(area,age,salary)、(area,age)、(area)三个索引,这被称为最佳左前缀
    特性。因此我们在创建复合索引时应该将最常用作限制条件的列放在最左边,依次递减。

    3,索引不会包含有NULL值的列

    只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为NULL。

    4,使用短索引

    对串列进行索引,如果可能应该指定一个前缀长度。例如,如果有一个CHAR(255)的 列,如果在前10 个或20 个字符内,多数值是惟一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。

    5,排序的索引问题

    mysql查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引。

    6,like语句操作

    一般情况下不鼓励使用like操作,如果非使用不可,如何使用也是一个问题。like “%a%” 不会使用索引而like “aaa%”可以使用索引。

    7,不要在列上进行运算

    select * from users where
    YEAR(adddate)

    8,不使用NOT IN和操作

    NOT IN和操作都不会使用索引将进行全表扫描。NOT IN可以NOT EXISTS代替,id3则可使用id>3 or id


    添加索引示例:

    CREATE INDEX IDX_AUDITSTATUS ON [shanghaiDB].[dbo].[Activity](AUDITSTATUS) WITH(ONLINE=ON)
    
    CREATE INDEX IDX_ANUMMID ON [nantongDB].[dbo].[Orders](ANUM,MID) WITH(ONLINE=ON)
    
    CREATE INDEX IDX_SiteCode ON Usercenter.[dbo].MO(SiteCode) WITH(ONLINE=ON)
    
    CREATE INDEX IDX_AccessDt ON [all].[dbo].[AccessLog](AccessDt) WITH(ONLINE=ON)

    Create index注意n如果是大表建立索引,切记加上ONLINE参数

    这几天在做数据库的优化,有个2亿记录的表,发现需要添加一个联合索引,结果就采用普通的create index index_name on tablename (entp_id,sell_date),结果悲剧了,把所有的DML语句都阻塞了,导致系统不能正常使用,还好是晚上10点,用户不是非常多,1个小时候,索引结束,阻塞解决;

    上网查了一下,如果加上 online参数后,就可以在线做索引,而不需要阻塞所有的DML语句,血的教训,拿出来与各位共勉,具体online与不加online区别如下:

    1. DML操作对create index 的影响。 如果在create的时候,有其他的进程在对这个index 所对应的数据进行DML操作,create会受影响:

    SQL> create table test (id number, name varchar2(20));
    
    Table created.

    然后重新开一个session:

    SQL> insert into test values (1,'lms');
    
    1 row created.
    
    <no commit>
    
    SQL> create index t1 on test(id);
    create index t1 on test(id)
    *
    ERROR at line 1:
    ORA-00054: resource busy and acquire with NOWAIT specified

    2. 加online这个参数,这个参数加上以后,除了create过程中index 保持online状态,Oracle还会在create index之前等待所有DML操作结束,然后得到DDL锁,开始create.

    SQL> create index t1 on test(id) online;
    <hold before commit>
    <after commit>
    
    SQL> commit;
    
    Commit complete.
    
    Index altered.

    如果不commit,上面的操作就会一直hold。

    所以以后create索引和rebuild索引的时候最好加上online。

    展开全文
  • 对数据库索引的理解及适合建立索引字段

    万次阅读 多人点赞 2018-03-06 13:17:43
    转载深入浅出数据库索引原理,哪些字段适合建立索引 问题 为什么要给表加上主键? 为什么加索引后会使查询变快? 为什么加索引后会使写入、修改、删除变慢? 什么情况下要同时在两个字段上建索引? 这些问题...
  • 那些字段适合建索引

    千次阅读 2019-05-28 11:30:19
    数据库建立索引常用的规则如下: 1、表的主键、外键必须有索引;...6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;7、复合索引的建立需要进行仔细分析;尽量考虑用单字段...
  • 索引B-Tree: 一般来说, MySQL 中的 B-Tree 索引的物理文件大多都是以 B+tree的结构来存储的,也就是所有实际需要的数据都存放于 Tree 的 Leaf Node,而且到任何一个 Leaf Node 的最短路径的长度都是完全相同的,...
  • 为什么性别字段不适合建索引

    千次阅读 2020-11-09 11:25:05
    大家都知道索引分聚集索引和非聚集索引,性别字段因为可重复肯定只能建立非聚集索引,然而因为非聚集索引叶子节点存储的是索引值和聚集索引值,需要回表。所以在性别这种辨别度较低的字段上建立索引索引树可能只有...
  • 理论文章会告诉你值重复率高的字段不适合建索引。不要说性别字段只有两个值,网友亲测,一个字段使用拼音首字母做值,共有26种可能,加上索引后,百万加的数据量,使用索引的速度比不使用索引要慢! 一个表可能会...
  • oracle复合索引介绍(多字段索引)

    千次阅读 2019-10-31 16:31:44
    如果分别按纳税人识别号,税务机关代码,月份3个字段查询,每个字段在该表中的可选性或约束性都强,如一个纳税人识别号有很多纳税记录,一个税务机关代码和同一月份记录就更多了,所以3个字段合起来,"某个纳税人识别号+...
  • 1、表的主键、外键必须有索引;...6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引; 7、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替: A、正确选择复合索引中的主列字...
  • 数据库索引字段请不要为NULL

    千次阅读 2018-01-02 08:48:21
    一、实验 create table tbNotNull ( `id` INT ( 11 ) NOT NULL,  name varchar( ...所以说索引字段最好不要为NULL,因为NULL会使索引、索引统计和值更加复杂,并且需要额外一个字节的存储空间。
  • 数据库字段属性和索引

    千次阅读 2019-07-05 23:30:25
    主键:primary key ,主要的键,一张表只能有一个字段可以使用对应的键,用来唯一的约束该字段里面的数据,能重复,这种称之为主键。 1.增加主键 SQL操作中有多种方式可以给表增加主键:大体分为三种 方案1:在...
  •  POST /test_kibana/...同样可以修改一个已经有的字段类型:  POST /test_kibana/product/_mapping?pretty   {  "properties": {  "keyword":{  "index":true,  "type":"keyword" }  }  }  
  • 为什么状态少的字段不能建索引

    万次阅读 2016-06-24 12:47:35
    大多教科书和前辈们都说状态少的字段不要建索引,由此带来的开销还不如索引,但是这句话有多少人真的知道,或者说有多少人真的对此有比较深刻的理解,而不是听别人道听途说。这样记得快,忘记的也慢。这篇我来...
  • 时间字段索引

    万次阅读 2018-11-14 22:05:20
     实际上,您可以索引理解为一种特殊的目录。微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引、簇集索引)和非聚集索引(nonclustered index,也称非聚类索引、非簇集索引)。下面,...
  • 原文地址:... 官方文档:index ...索引index  ...这个参数可以控制字段应该怎样建索引,怎样查询。...· no: 不把此字段添加到索引中,也就是不建索引,此字段不可查询  · not_analyzed:将字段的原
  • 建立组合索引字段顺序优化

    千次阅读 2019-01-14 21:39:25
    对于我们需要创建的组合索引,如果同时又经常单独使用其中某个字段作为查询条件,这样的字段是要求放在组合索引前面的。 因为这种场景下,能直接使用组合索引做范围扫描,否则,如果该字段放在后面,可能走索引跳跃...
  • PostgreSql索引的使用3--多字段索引

    千次阅读 2015-05-19 10:10:38
    字段索引就是索引中的字段不是一个,其创建的方式与单字段索引的语法一致。 如:create index idx_name on tanle_name(column_name1,column_name2);  多字段索引只适合B-tree, GiST 和 GIN三种索引方式,并且...
  • 会发现随着表中记录的增多,查询的速度也会也来越慢,特别是那种日志记录,少则几十万,多则上百万,甚至上千万数据,如果查询一次耗时太长,会严重影响业务逻辑,这时候可以考虑给经常作为条件的字段添加索引了...
  • 目录 前言: 1. 实例分析 1.1 如何创建循环函数 1.2 进行查询操作 2. 索引选择 ...2.3 Mysql怎么得到索引的基数的呢?...2.4.3 如果表的统计数据准确,使用analyze table t 3. 选错索引,处理方...
  • 尽量选择区分度高的字段作为索引,区分度的公式是 count(distinct col)/count(*),表示 字段不重复的比例,比例越大我们扫描的记录数越少,唯一键的区分度是 1,而一些状态、 性别字段可能在大数据面前区分度就是 0。...
  • · no: 不把此字段添加到索引中,也就是不建索引,此字段不可查询 · not_analyzed:将字段的原始值放入索引中,作为一个独立的term,它是除string字段以外的所有字段的默认值。 · analyzed:string字段的默认值...
  • MySQL给表里的某个字段建立索引

    千次阅读 2019-04-15 15:29:41
    注:`table_name` 和 `column` 中的``是Esc下方的一个键 ~`,可省略写``,直接写表名和字段名 1.添加PRIMARY KEY(主键索引): ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` ) 2.添加UNIQUE(唯一索引)...
  • 时间字段是否适合建立索引

    万次阅读 2017-11-22 11:56:13
    时间字段是否适合建索引可以建立索引的;至于建立聚集索引或者是非聚集索引,那要看你这个时间字段的具体...建立非聚集索引,确实,一般情况下可以提高速度,但是一般并会达到你想要的速度。只有在适当的列...
  • 删除字段索引

    千次阅读 2016-03-30 11:27:01
    --删除索引 sql drop index INDX_ISS_AREA_REL_16640_1 on ISS_AREA_REL --删除索引mysql  drop index INDX_ISS_AREA_REL_16640_1 on ISS_AREA_REL(INNER_CODE,ISS_AREA...删除索引可以使用ALTER TABLE或DROP IN
  • MySQL总结(二)——MySQL索引

    千次阅读 多人点赞 2019-09-14 12:27:56
    对于哈希索引来说,底层的数据结构就是哈希表,因此在绝大多数需求为单条记录查询的时候,可以选择哈希索引,查询性能最快;其余大部分场景,建议选择BTree索引。 BTree索引 MySQL的BTree索引使用的是B树中的B+Tree...
  • sql 两个字段建立唯一索引

    千次阅读 2019-06-06 16:44:56
    同表两个字段建立唯一索引 业务上需要一个身份证账号对应一个手机号,所以在数据库中使用到了唯一索引的概念 unique 唯一索引 索引存储方式可选be树和哈希类型 be树适合有从属关系,并且能从父级找到其下子数据的...
  •  可以是一对一、一对多、多对多的关系。在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体。  在特殊情况下,它们可能是一对多或多对一的关系,即一张原始单证对应多个实体,或多张原始单证...
  • 详细讲述了在SQLITE中使用时间字段索引进行SQL插入及查询操作的方法

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 287,132
精华内容 114,852
关键字:

不可以作为索引的字段