精华内容
下载资源
问答
  • 数据库索引类型
    万次阅读
    2019-03-19 12:53:34

    索引分四类:

    index ----普通的索引,数据可以重复

    fulltext----全文索引,用来对大表的文本域(char,varchar,text)进行索引。语法和普通索引一样。 

    unique ----唯一索引,唯一索引,要求所有记录都唯一

    primary key ----主键索引,也就是在唯一索引的基础上相应的列必须为主键

     

    第一种:index unique  scan

        索引唯一扫描,当可以优化器发现某个查询条件可以利用到主键、唯一键、具有外键约束的列,或者只是访问其中某行索引所在的数据的时候,优化器会选择这种扫描类型。

     

    第二种:index range scan

        索引范围扫描,当优化器发现在UNIQUE列上使用了大于、小于、大于等于、小于等于以及BETWEEN等就会使用范围扫描,在组合列上只使用部分进行查询,导致查询出多行数据。对非唯一的索引列上进行任何活动都会使用index range scan

     

    第三种:index full scan

        全索引扫描,如果要查询的数据可以全部从索引中获取,则使用全索引扫描。

     

    第四种:index fast full scan

        索引快速扫描,扫描索引中的全部的数据块,与全索引扫描的方式基本上类似。两者之间的明显的区别是,索引快速扫描对查询的数据不进行排序,数据返回的时候不是排序的。“在这种存取方法中,可以使用多块读功能,也可以使用并行读入,从而得到最大的吞吐量和缩短执行时间”。

    更多相关内容
  • 索引 索引分为主键索引、唯一索引、普通索引、聚集索引、全文索引几种,而索引其实就是在无序的数据中建立索引...索引类型 主键索引 数据列不允许重复,不允许为NULL,可以被引用为外键,一个表只能有一个主键索引 唯

    索引

    索引分为主键索引、唯一索引、普通索引、聚集索引、全文索引几种,而索引其实就是在无序的数据中建立索引,每次查询可以根据索引迅速查到我们想要的数据(就像字典的目录a-z一样)

    • 优点

      • 提高数据查找速度
      • 提高group by、order by分组与排序的时间
    • 缺点

      • 每增加数据都需要更新索引,随者数据量增大,索引维护成本会增加
      • 占用一定的存储空间,.myi后缀的文件存储的就是索引文件。

    索引类型

    主键索引

    数据列不允许重复,不允许为NULL,可以被引用为外键,一个表只能有一个主键索引

    唯一索引

    数据列不允许重复,允许为NULL值,不可以被引用为外键,一个表允许多个列创建唯一索引

    普通索引

    基本的索引类型,没有唯一性限制,允许为NULL值,不可以被引用为外键,一个表可以有多个普通索引

    主键索引、唯一索引、普通索引区别:

    索引类型数据是否允许重复是否允许NULL是否可以当作外键索引个数限制
    主键索引仅有一个
    唯一索引允许多个
    普通索引允许多个

    表中可以看出约束是从高到低,对比表种内容然后依据不同场景进行使用

    聚集索引(聚簇索引)

    在聚集索引中,表中数据行的物理位置与逻辑值(索引和数据为同一个文件)的顺序相同,一个表中只能包含一个聚集索引,因为物理顺序只能有一个。聚集索引通常提供更快的数据访问速度。
    其中 InnoDB采用的就是聚簇索引,数据和索引文件为一个idb文件,表数据文件本身就是主索引,相邻的索引临近存储。 叶节点data域保存了完整的数据记录(数据[除主键id外其他列data]+主索引[索引key:表主键id])。 叶子节点直接存储数据记录,以主键id为key,叶子节点中直接存储数据记录。(底层存储结构: frm -表定义、 ibd: innoDB数据&索引文件)

    (1)如果表定义了主键,则PK就是聚集索引;
    (2)如果表没有定义主键,则第一个非空唯一索引(not NULL unique)列是聚集索引;
    (3)否则,InnoDB会创建一个隐藏的row-id作为聚集索引;

    在这里插入图片描述

    非聚簇索引

    索引和数据分开的索引
    其中MyISAM底层采用的就是非聚簇索引,使用myi索引文件和myd数据文件分离,索引文件仅保存数据记录的指针地址。叶子节点data域存储指向数据记录的指针地址。(底层存储结构: frm -表定义、 myi -myisam索引、 myd-myisam数据)
    在这里插入图片描述

    覆盖索引

    所谓覆盖索引就是指索引中包含了查询中的所有字段,这种情况下就不需要再进行回表查询了
    MySQL 中只能使用 B-Tree 索引做覆盖索引,因为哈希索引等都不存储索引的列的值,覆盖索引对于 MyISAM 和 InnoDB 都非常有效,可以减少系统调用和数据拷贝等时间

    组合索引

    使用多个列来组成一个索引,比如B-Tree的方式

    全文索引

    主要用于海量数据的搜索,比如淘宝、京东对商品的搜索就可以建立全文索引(不可能用like模糊匹配吧),这个类型在mysql5.6开始支持InnoDB引擎的全文索引,功能没有专业搜索引擎比如solr、es丰富,如果需求简单,可以使用全文索引

    适用场景:适用于海量数据的关键字模糊搜索,比如简易版的搜索引擎

    索引的实现方式

    B-Tree索引

    InnoDB使用的是B-Tree算法,即每个叶子节点包含指向下一个叶子节点的指针,就像一个树一样

    在这里插入图片描述
    适用场景:最常用的一个索引类型,可以适用于多种场景

    工作原理:B-Tree索引中,联合索引中的索引项会先根据第一个索引列进行排序,第一个索引列相同的情况下,会再按照第二个索引列进行排序,依次类推。

    可以应用到B-Tree索引的情况:

    1. 全值匹配:查找条件和索引中的所有列相匹配
    2. 匹配最左前缀:查找条件只有索引中的第一列
    3. 匹配列前缀:比如有两个索引,一个是姓,一个是名,先找到zhang的列,然后再根据已找到的列找到名为s开头的人,也可以应用到索引
    4. 匹配范围值:比如查找姓在chen到zhang之间的人;或者查找姓为zhang,然后名为san到si范围的人
    5. 只访问索引的查询:即要查询的数据都在索引中包含,则只需要访问索引就行,无需访问数据行,比如只需要查询姓和名两列,而这两列刚好又是联合索引。这种索引被称作覆盖索引
    6. 索引排序:比如使用姓进行排序

    无法使用到B-Tree索引的情况:

    1. 索引不是最左列开始查找,则无法使用索引。比如直接查找名为san的人,则无法应用到索引
    2. 索引不全:比如有三个字段的联合索引,条件中只有第一个、和第三个的字段条件,跳过了中间某个列,则只能使用到索引的第一列
    3. 如果查询中有某个列的范围查询,则该列右边的所有列都无法使用索引优化查询(范围的话没有具体的值)。

    哈希索引

    如果在列上建立索引,则针对每一行数据,存储引擎会根据所有的索引列计算出一个哈希码,每一个行计算出的哈希码会组成一个哈希表,同时在哈希表中存储了指向每个数据行的指针。
    哈希表结构如下:
    在这里插入图片描述
    适用场景:仅作等值匹配且数据重复率低且对索引查找速度要求高的情况

    可以应用到哈希索引的情况:

    1. 只有精确匹配全部索引行的查询条件才能利用索引

    无法使用到哈希索引的情况:

    1. 索引中不包含任何列的值
    2. 索引无法应用于排序
    3. 不支持部分索引列匹配查找(必须使用全部索引列的查询条件才能使用哈希索引优化查询)
    4. 无法范围查找,只能等值比较
    5. 哈希冲突会影响性能:比如某个列的数据重复率非常高,则每次在找到匹配的哈希后还需要对这个哈希码的所有数据进行等值比较

    其中,还有一个叫做“自适应哈希索引”,是当InnoDB注意到某些索引的使用频率很高时,会在B-Tree索引之上再建立一层哈希索引,以提高查询效率

    空间数据索引(R-Tree)

    空间索引可用于地理数据存储,它需要GIS相关函数的支持,由于MySQL的GIS支持并不完
    善,所以该索引方式在MySQL中很少有人使用。

    扩展

    什么是回表

    如果 select 所需获得列中有大量的非索引列,索引就需要到表中找到相应的列的信息,这就叫回表

    比如如下例子,先使用普通索引查询除出ID,然后再去聚簇索引查询具体数据的过程就叫左做回表
    在这里插入图片描述
    如何避免回表?

    使用聚集索引(主键或第一个唯一索引)就不会回表,普通索引就会回表

    比如select id, name, sex from user;,将单列索引(name)升级为联合索引(name, sex),即可避免回表,因为要查询的name和sex都在索引中了

    索引下推

    MySQL 5.6引入了索引下推优化,可以在索引遍历过程中,对索引中包含的字段先做判断,过滤掉不符合条件的记录,减少回表字数

    select * from tuser where name like '张 %' and age=10 and ismale=1;
    

    没有索引下推:首先根据索引来查找记录,然后再根据where条件来过滤记录(回表)
    有索引下推:MySQL会在取出索引的同时,判断是否可以进行where条件过滤再进行索引查询(回表)

    唯一索引导致死锁

    如图所示,有三个事务同时插入同一个记录,导致唯一索引冲突的过程:
    在这里插入图片描述
    死锁发生过程:

    1. T1时刻sessionA插入会加排他锁
    2. T2时刻SessionB插入同id会主键冲突,会加上共享锁
    3. T3时刻SessionC插入同id会主键冲突,会加上共享锁
    4. 这时,SessionA回滚释放排他锁,sessionB向获得排他锁,但发现sessionC有共享锁存在,B和C相互等待造成死锁

    根本原因:
    唯一索引导致,本质是并发请求导致一个数据重复插入或是网络抖动造成

    解决方案:

    1. 可以使用缓存将重复请求去重,确保同时只执行一个相同sql
    2. 异常捕捉,mysql有死锁检测和恢复,只有一个事务会成功,只需要catch异常即可
    展开全文
  • 数据库索引类型及实现方式

    万次阅读 2017-07-12 18:43:23
    数据库索引类型及实现方式 1、索引定义  数据库索引好比是一本书前面的目录,能加快数据库的查询速度。索引是对数据库表中一个或多个列(例如,employee 表的姓氏 (lname) 列)的值进行排序的结构。如果想...

    数据库索引类型及实现方式

    1、索引定义
      数据库 索引好比是一本书前面的目录,能加快数据库的查询速度。 索引是对数据库表中一个或多个列(例如,employee 表的姓氏 (lname) 列)的值进行排序的结构。如果想按特定职员的姓来查找他或她,则与在表中搜索所有的行相比,索引有助于更快地获取信息。
    2、建立索引的优缺点:
    优点:
        1.大大加快数据的检索速度;   
        2.创建唯一性索引,保证数据库表中每一行数据的唯一性;   
        3.加速表和表之间的连接;   
        4.在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。
    缺点:
    
      1.索引需要占用数据表以外的物理存储空间
    
      2.创建索引和维护索引要花费一定的时间
    
      3.当对表进行更新操作时,索引需要被重建,这样降低了数据的维护速度。
    3、索引类型:
      根据数据库的功能,可以在数据库设计器中创建索引:唯一索引、主键索引和聚集索引。 尽管唯一索引有助于定位信息,但为获得最佳性能结果,建议改用主键或唯一约束。  
    
    唯一索引:   UNIQUE     例如:create unique index stusno on student(sno);
    表明此索引的每一个索引值只对应唯一的数据记录,对于单列惟一性索引,这保证单列不包含重复的值。对于多列惟一性索引,保证多个值的组合不重复。
    
    主键索引:   primary key
    数据库表经常有一列或列组合,其值唯一标识表中的每一行。该列称为表的主键。   在数据库关系图中为表定义主键将自动创建主键索引,主键索引是唯一索引的特定类型。该索引要求主键中的每个值都唯一。当在查询中使用主键索引时,它还允许对数据的快速访问。 
    
    聚集索引(也叫聚簇索引):cluster  
    在聚集索引中,表中行的物理顺序与键值的逻辑(索引)顺序相同。一个表只能包含一个聚集索引。   如果某索引不是聚集索引,则表中行的物理顺序与键值的逻辑顺序不匹配。与非聚集索引相比,聚集索引通常提供更快的数据访问速度。
     
    4、索引的实现方式
    1 B+树
        我们经常听到B+树就是这个概念,用这个树的目的和红黑树差不多,也是为了尽量保持树的平衡,当然红黑树是二叉树,但B+树就不是二叉树了,节点下面可以有多个子节点,数据库开发商会设置子节点数的一个最大值,这个值不会太小,所以B+树一般来说比较矮胖,而红黑树就比较瘦高了。
    关于B+树的插入,删除,会涉及到一些算法以保持树的平衡,这里就不详述了。ORACLE的默认索引就是这种结构的。
    如果经常需要同时对两个字段进行AND查询,那么使用两个单独索引不如建立一个复合索引,因为两个单独索引通常数据库只能使用其中一个,而使用复合索引因为索引本身就对应到两个字段上的,效率会有很大提高。
    
    2 散列索引
        第二种索引叫做散列索引,就是通过散列函数来定位的一种索引,不过很少有单独使用散列索引的,反而是散列文件组织用的比较多。
    散列文件组织就是根据一个键通过散列计算把对应的记录都放到同一个槽中,这样的话相同的键值对应的记录就一定是放在同一个文件里了,也就减少了文件读取的次数,提高了效率。
    散列索引呢就是根据对应键的散列码来找到最终的索引项的技术,其实和B树就差不多了,也就是一种索引之上的二级辅助索引,我理解散列索引都是二级或更高级的稀疏索引,否则桶就太多了,效率也不会很高。
    
    3 位图索引
        位图索引是一种针对多个字段的简单查询设计一种特殊的索引,适用范围比较小,只适用于字段值固定并且值的种类很少的情况,比如性别,只能有男和女,或者级别,状态等等,并且只有在同时对多个这样的字段查询时才能体现出位图的优势。
    位图的基本思想就是对每一个条件都用0或者1来表示,如有5条记录,性别分别是男,女,男,男,女,那么如果使用位图索引就会建立两个位图,对应男的10110和对应女的01001,这样做有什么好处呢,就是如果同时对多个这种类型的字段进行and或or查询时,可以使用按位与和按位或来直接得到结果了。
    
    B+树最常用,性能也不差,用于范围查询和单值查询都可以。特别是范围查询,非得用B+树这种顺序的才可以了。
    HASH的如果只是对单值查询的话速度会比B+树快一点,但是ORACLE好像不支持HASH索引,只支持HASH表空间。
    位图的使用情况很局限,只有很少的情况才能用,一定要确定真正适合使用这种索引才用(值的类型很少并且需要复合查询),否则建立一大堆位图就一点意义都没有了。
    展开全文
  • 主要介绍了网站数据库的优化最为基础的优化措施就是建立数据库索引了,这里就介绍一下,什么是数据库索引?有哪些类型和特点
  • 数据库的五种索引类型

    千次阅读 2020-09-21 10:13:57
    数据库的5种索引类型 1. 普通索引 2. 唯一索引 3. 全文索引(FULLTEXT) 4. 单列索引、多列索引 5. 组合索引(最左前缀) 摘自

    MySQL索引的概念

    索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。上述SQL语句,在没有索引的情况下,数据库会遍历全部200条数据后选择符合条件的;而有了相应的索引之后,数据库会直接在索引中查找符合条件的选项。如果我们把SQL语句换成“SELECT * FROM article WHERE id=2000000”,那么你是希望数据库按照顺序读取完200万行数据以后给你结果还是直接在索引中定位呢?上面的两个图片鲜明的用时对比已经给出了答案(注:一般数据库默认都会为主键生成索引)。

    索引分为聚簇索引和非聚簇索引两种,聚簇索引是按照数据存放的物理位置为顺序的,而非聚簇索引就不一样了;聚簇索引能提高多行检索的速度,而非聚簇索引对于单行的检索很快。

    数据库的5种索引类型

    1. 普通索引

    这是最基本的索引,它没有任何限制,

    –直接创建索引
    CREATE INDEX index_name ON table(column(length))
    –修改表结构的方式添加索引
    ALTER TABLE table_name ADD INDEX index_name ON (column(length))
    –创建表的时候同时创建索引
    CREATE TABLE `table` (
    `id` int(11) NOT NULL AUTO_INCREMENT ,
    `title` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
    `content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL ,
    `time` int(10) NULL DEFAULT NULL ,
    PRIMARY KEY (`id`),
    INDEX index_name (title(length))
    )
    –删除索引
    DROP INDEX index_name ON table
    
    2. 唯一索引

    与普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值(注意和主键不同)。如果是组合索引,则列值的组合必须唯一,创建方法和普通索引类似。

    –创建唯一索引
    CREATE UNIQUE INDEX indexName ON table(column(length))
    –修改表结构
    ALTER TABLE table_name ADD UNIQUE indexName ON (column(length))
    –创建表的时候直接指定
    CREATE TABLE `table` (
    `id` int(11) NOT NULL AUTO_INCREMENT ,
    `title` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
    `content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL ,
    `time` int(10) NULL DEFAULT NULL ,
    PRIMARY KEY (`id`),
    UNIQUE indexName (title(length))
    );
    
    3. 全文索引(FULLTEXT)

    MySQL从3.23.23版开始支持全文索引和全文检索,FULLTEXT索引仅可用于 MyISAM 表;他们可以从CHAR、VARCHAR或TEXT列中作为CREATE TABLE语句的一部分被创建,或是随后使用ALTER TABLE 或CREATE INDEX被添加。对于较大的数据集,将你的资料输入一个没有FULLTEXT索引的表中,然后创建索引,其速度比把资料输入现有FULLTEXT索引的速度更为快。不过切记对于大容量的数据表,生成全文索引是一个非常消耗时间非常消耗硬盘空间的做法。

    –创建表的适合添加全文索引
    CREATE TABLE `table` (
    `id` int(11) NOT NULL AUTO_INCREMENT ,
    `title` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
    `content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL ,
    `time` int(10) NULL DEFAULT NULL ,
    PRIMARY KEY (`id`),
    FULLTEXT (content)
    );
    –修改表结构添加全文索引
    ALTER TABLE article ADD FULLTEXT index_content(content)
    –直接创建索引
    CREATE FULLTEXT INDEX index_content ON article(content)
    
    4. 单列索引、多列索引

    多个单列索引与单个多列索引的查询效果不同,因为执行查询时,MySQL只能使用一个索引,会从多个索引中选择一个限制最为严格的索引。

    5. 组合索引(最左前缀)

    平时用的SQL查询语句一般都有比较多的限制条件,所以为了进一步榨取MySQL的效率,就要考虑建立组合索引。例如上表中针对title和time建立一个组合索引:ALTER TABLE article ADD INDEX index_titme_time (title(50),time(10))。建立这样的组合索引,其实是相当于分别建立了下面两组组合索引:
    –title,time

    –title
    为什么没有time这样的组合索引呢?这是因为MySQL组合索引“最左前缀”的结果。简单的理解就是只从最左面的开始组合。并不是只要包含这两列的查询都会用到该组合索引,如下面的几个SQL所示:

    –使用到上面的索引
    SELECT * FROM article WHREE title='测试' AND time=1234567890;
    SELECT * FROM article WHREE utitle='测试';
    –不使用上面的索引
    SELECT * FROM article WHREE time=1234567890;
    

    MySQL索引的优化

    上面都在说使用索引的好处,但过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。建立索引会占用磁盘空间的索引文件。一般情况这个问题不太严重,但如果你在一个大表上创建了多种组合索引,索引文件的会膨胀很快。索引只是提高效率的一个因素,如果你的MySQL有大数据量的表,就需要花时间研究建立最优秀的索引,或优化查询语句。下面是一些总结以及收藏的MySQL索引的注意事项和优化方法。

    1. 何时使用聚集索引或非聚集索引?

    动作描述 使用聚集索引 使用非聚集索引
    列经常被分组排序 使用 使用
    返回某范围内的数据 使用 不使用
    一个或极少不同值 不使用 不使用
    小数目的不同值 使用 不使用
    大数目的不同值 不使用 使用
    频繁更新的列 不使用 使用
    外键列 使用 使用
    主键列 使用 使用
    频繁修改索引列 不使用 使用
    事实上,我们可以通过前面聚集索引和非聚集索引的定义的例子来理解上表。如:返回某范围内的数据一项。比如您的某个表有一个时间列,恰好您把聚合索引建立在了该列,这时您查询2004年1月1日至2004年10月1日之间的全部数据时,这个速度就将是很快的,因为您的这本字典正文是按日期进行排序的,聚类索引只需要找到要检索的所有数据中的开头和结尾数据即可;而不像非聚集索引,必须先查到目录中查到每一项数据对应的页码,然后再根据页码查到具体内容。其实这个具体用法我还不是很理解,只能等待后期的项目开发中慢慢学学了。

    2. 索引不会包含有NULL值的列

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

    3. 使用短索引

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

    4. 索引列排序

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

    5. like语句操作

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

    6. 不要在列上进行运算

    例如:select * from users where YEAR(adddate)<2007,将在每个行上进行运算,这将导致索引失效而进行全表扫描,因此我们可以改成:select * from users where adddate<’2007-01-01′。关于这一点可以围观:一个单引号引发的MYSQL性能损失。

    最后总结一下,MySQL只对一下操作符才使用索引:<,<=,=,>,>=,between,in,以及某些时候的like(不以通配符%或_开头的情形)。而理论上每张表里面最多可创建16个索引,不过除非是数据量真的很多,否则过多的使用索引也不是那么好玩的,比如刚才针对text类型的字段创建索引的时候,系统差点就卡死了。

    建立索引的优缺点:

    为什么要创建索引呢?
    这是因为,创建索引可以大大提高系统的性能。
    	第一、通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。 
        第二、可以大大加快 数据的检索速度,这也是创建索引的最主要的原因。 
        第三、可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。 
        第四、在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。 
        第五、通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
    	 也许会有人要问:增加索引有如此多的优点,为什么不对表中的每一个列创建一个索引呢?这种想法固然有其合理性,然而也有其片面性。虽然,索引有许多优点, 但是,为表中的每一个列都增加索引,是非常不明智的。
    
    这是因为,增加索引也有许多不利的一个方面:
    	第一、创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。 
        第二、索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间。如果要建立聚簇索引,那么需要的空间就会更大。 
        第三、当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。
    

    什么样的字段适合创建索引:

    索引是建立在数据库表中的某些列的上面。因此,在创建索引的时候,应该仔细考虑在哪些列上可以创建索引,在哪些列上不能创建索引。
    一般来说,应该在这些列上创建索引,例如:

       第一、在经常需要搜索的列上,可以加快搜索的速度; 
    
       第二、在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构; 
    
       第三、在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度; 
    
       第四、在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的; 
    
       第五、在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间; 
    
       第六、在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。
    
    
       建立索引,一般按照select的where条件来建立,比如: select的条件是where f1 and f2,那么如果我们在字段f1或字段f2上简历索引是没有用的,只有在字段f1和f2上同时建立索引才有用等。
    

    什么样的字段不适合创建索引:

    同样,对于有些列不应该创建索引。一般来说,不应该创建索引的的这些列具有下列特点:

    第一,对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引,

    并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。
    第二,对于那些只有很少数据值的列也不应该增加索引。这是因为,由于这些列的取值很少,例如人事表的性别列,

    在查询的结果中,结果集的数据行占了表中数据行的很大比 例,即需要在表中搜索的数据行的比例很大。

    增加索引,并不能明显加快检索速度。
    第三,对于那些定义为text, image和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。
    第四,当修改性能远远大于检索性能时,不应该创建索 引。这是因为,修改性能和检索性能是互相矛盾的。

    当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。

    因此,当修改性能远远大于检索性能时,不应该创建索引。

    创建索引的方法::
    --1、创建索引,例如 
    create index <索引的名字> on table_name (列的列表); 
    --2、修改表,例如 
    alter table table_name add index[索引的名字] (列的列表); 
    --3、创建表的时候指定索引,例如
    create table table_name ( [...], INDEX [索引的名字] (列的列表) );
    
    查看表中索引的方法:
    show index from table_name; --查看索引
    
    索引的类型及创建例子::
    1.PRIMARY KEY (主键索引)
    MySQL> alter table table_name add primary key ( `column` )
    2.UNIQUEUNIQUE KEY (唯一索引)
    mysql> alter table table_name add unique (`column`)
    3.FULLTEXT (全文索引)
    mysql> alter table table_name add fulltext (`column` )
    4.INDEX (普通索引)
    mysql> alter table table_name add index index_name ( `column` )
    5.多列索引 (聚簇索引)
     mysql> alter table `table_name` add index index_name ( `column1`, `column2`, `column3` )
    

    摘自

    展开全文
  • MYSQL数据库四种索引类型介绍

    千次阅读 多人点赞 2020-04-20 18:24:46
    MYSQL数据库四种索引类型 主键索引: 主键是一种唯一性索引,但它必须指定为PRIMARY KEY,每个表只能有一个主键。 唯一索引: 索引列的所有值都只能出现一次,即必须唯一,值可以为空。 普通索引 : 基本的...
  • 数据库中常见的索引

    2022-04-20 09:53:04
    Oracle数据库中最常见的索引类型是b-tree索引,也就是B-树索引,以其同名的计算科学结构命名。CREATE INDEX语句时,默认就是在创建b-tree索引。没有特别规定可用于任何情况。 位图索引(bitmap index) 位图索引特定于...
  • 关系型数据库索引类型

    千次阅读 2016-09-18 21:46:45
    索引类型分类: 1.主索引:主索引是一种只能在数据库表中建立不能在自由表中建立的索引。在指定的字段或表达式中,主索 引的关键字绝对不允许有重复值。 2.候选索引:和主索引类似,它的值也 不允许在指定的字段或...
  • 数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用B树及其变种B+树。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种...
  • 唯一索引/非唯一索引主键索引(主索引)聚集索引/非聚集索引组合索引唯一索引/非唯一索引唯一索引1.唯一索引是在表上一个或者多个字段组合...主键索引(主索引)是唯一索引的特定类型。表中创建主键时自动创建的索...
  • 数据库常见的四种索引

    千次阅读 2020-09-13 23:01:19
    数据库常见的四种索引 1.普通索引:主要以B+树和哈希索引为主,任务是加快对数据的访问速度,常用于查询和排序的条件,值可以为空并没有唯一性的限制 2.唯一性索引:与普通索引类似,不同的是唯一性索引索引列的值...
  • 数据库基础知识(索引

    千次阅读 2022-03-25 17:11:14
    为什么要使用数据库? 1.数据保存在内存 优点:存取速度快 缺点:数据不能永久保存 2.数据保存在文件 优点:数据永久保存 缺点:1.速度比内存操作慢,频繁的IO操作。2.查询数据不方便 3.数据保存在数据库 ...
  • 数据库索引详解

    万次阅读 多人点赞 2021-11-17 19:16:13
    数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询,更新数据库中表的数据。索引的实现通常使用B树和变种的B+树(MySQL常用的索引就是B+树)。除了数据之外,数据库系统还维护为满足特定查找算法的...
  • 数据库 索引类型及其区别

    千次阅读 2017-02-14 21:21:52
    Single column 单行索引 Concatenated 多行索引 Unique 唯一索引 NonUnique 非唯一索引 Function-based函数索引 Domain 域索引 物理上: Partitioned 分区索引 NonPartitioned 非分区索引 B-tree: Normal...
  • MySQL索引的概念以及七种索引类型介绍。
  • 数据库索引类型

    万次阅读 2009-05-31 09:59:00
    逻辑上:Single column 单行索引Concatenated 多行索引Unique 唯一索引NonUnique 非唯一索引Function-based函数索引Domain 域索引物理上:Partitioned 分区索引NonPartitioned 非分区索引B-tree:Normal 正常型B树...
  • 什么是数据库索引

    千次阅读 2021-05-18 20:06:46
    BTREE 索引 ; HASH 索引 ; R-tree 索引(空间索引);Full-text (全文索引);BTREE树的特点 ; B+TREE树 ; 索引分类 ; 索引的用法 ; 如何去很高效的去使用索引
  • 数据库索引(B树,B+树,哈希)

    万次阅读 多人点赞 2018-05-05 13:39:49
    数据库索引是存储引擎用于快速找到记录的一种数据结构。         《高性能MySQL》 一. 什么是索引?    索引的目的就是便于快速查找。一本书的索引就是目录,可以让我们快速定位到要查找的内容;...
  • 关系型数据库索引

    千次阅读 2018-07-07 15:54:32
    索引,在我们的mysql中的也叫key,是存储引擎中用于快速找到记录的一种数据结构。这是索引的基本功能,当然,索引还有一些别的属性。但是《高性能mysql》这本书上并没有讲清楚一个事情,那就是索引和主键的区别。...
  • MYSQL数据库四种索引类型的简单使用

    万次阅读 2017-09-18 13:38:09
    MYSQL数据库索引类型包括普通索引,唯一索引,主键索引与主键索引,这里对这些索引的做一些简单描述: (1)普通索引 这是最基本的MySQL数据库索引,它没有任何限制。它有以下几种创建方式: 创建索引 CREATE ...
  • 数据库索引实现原理

    万次阅读 多人点赞 2019-04-15 16:28:54
    MySQL索引实现 在MySQL中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的,本文主要讨论MyISAM和InnoDB两个存储引擎的索引实现方式。 MyISAM索引实现 MyISAM引擎使用B+Tree作为索引结构,叶...
  • 数据库索引是为了提高查询速度而对表字段附加的一种标识。简单来说,索引其实是一种数据结构。数据库的索引类似于书籍的索引。在书籍中,索引允许用户不必翻阅完整个书就能迅速地找到所需要的信息。在数据库中,索引...
  • SQL Server 数据库索引

    千次阅读 2022-03-20 18:00:13
    索引类型3.1 聚集索引3.2 非聚集索引3.3 其他索引4. 创建与删除索引4.1 用 SQL 命令创建索引4.2 用 SSMS 创建索引4.3 用 SQL 命令删除索引4.4 用 SSMS 删除索引5. 修改和查看索引5.1 用 SQL 命令修改索引 1. 索引...
  • PostgreSQL索引类型

    千次阅读 2018-03-09 14:29:52
    PostgreSQL有很多索引类型。每种索引类型都有各自适用的情景,具体使用哪一种索引取决于数据类型、表中的底层基本数据和执行的查询类型。接下来简单看一下PostgreSQL中可用的索引类型有哪些,以及各种情况下适合使用...
  • MySQL数据库索引

    万次阅读 多人点赞 2018-09-23 09:31:41
    数据库有哪些索引 唯一索引 聚簇索引与非聚簇索引 全文索引 使用索引一定能提高查询性能吗? 哪些情况下设置了索引但是无法使用 哪些情况下需要设置索引、哪些情况下不需要 什么情况下应该使用组合索引而非...
  • 主流数据库索引及其例子

    千次阅读 多人点赞 2022-04-10 22:36:25
    数据库中使用索引的优缺点: 索引分类 普通索引 唯─性索引 主键索引 全文索引 空间索引 其他分类 索引设置的基本原则 创建索引 使用CREATE INDEX语句建立索引 创建表时创建索引 修改表时创建索引 ...
  • 数据库索引

    万次阅读 多人点赞 2018-11-11 09:27:25
    数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询,更新数据库中表的数据.索引的实现通常使用B树和变种的B+树(mysql常用的索引就是B+树) 除了数据之外,数据库系统还维护为满足特定查找算法的数据...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 580,238
精华内容 232,095
关键字:

数据库索引类型