精华内容
下载资源
问答
  • 2020-04-08 19:41:54

    索引的几种类型分别是普通索引、唯一索引、聚集索引、主键索引、全文索引。

     

    1. 唯一索引:在创建唯一索引时要不能给具有相同的索引值。
    2. 主键索引:在我们给一个字段设置主键的时候,它就会自动创建主键索引,用来确保每一个值都是唯一的。
    3. 聚集索引:我们在表中添加数据的顺序,与我们创建的索引键值相同,而且一个表中只能有一个聚集索引。
    4. 普通索引:它的结构主要以B+树和哈希索引为主,主要是对数据表中的数据进行精确查找。
    5. 全文索引:它的作用是搜索数据表中的字段是不是包含我们搜索的关键字,就像搜索引擎中的模糊查询。


    使用索引的优点:

    提高数据的搜索速度
    加快表与表之间的连接速度
    在信息检索过程中,若使用分组及排序子句进行时,通过建立索引能有效的减少检索过程中所需的分组及排序时间,提高检索效率。

    使用索引的缺点:

    在我们建立数据库的时候,需要花费的时间去建立和维护索引,而且随着数据量的增加,需要维护它的时间也会增加。
    在创建索引的时候会占用存储空间。
    在我们需要修改表中的数据时,索引还需要进行动态的维护,所以对数据库的维护带来了一定的麻烦。


     

    更多相关内容
  • Oracle几种索引?

    千次阅读 2020-02-09 09:43:32
    单列索引与复合索引 单列索引是基于单列所创建的索引,复合索引是基于两列或者多列所创建的索引 唯一索引与非唯一索引 唯一索引索引列值不能重复的索引,非唯一索引索引列可以重复的索引。都允许取 NULL 值,...
    • 单列索引与复合索引

    单列索引是基于单列所创建的索引,复合索引是基于两列或者多列所创建的索引

     

    • 唯一索引与非唯一索引

    唯一索引是索引列值不能重复的索引,非唯一索引是索引列可以重复的索引。都允许取 NULL 值,默认 Oracle 创建的索引是不唯一索引

     

    • B 树索引

    B 树索引是按 B 树算法组织并存放索引数据的,B 树索引主要依赖其组织并存放索引数据的算法来实现快速检索功能

     

    • 位图索引

    它采用位图偏移方式来与表的行 ROWID 号对应,通过位图索引中的映射函数完成位到行的 ROWID 的转换

    主要用于节省空间,减少oracle对数据块的访问

    采用位图索引一般是重复值太多、只有几个枚举值的表字段

     

    • 函数索引

    Oracle 对包含列的函数或表达式创建的索引

     

     

     


    【Java面试题与答案】整理推荐

     

    展开全文
  • Mysql索引有几种类型

    万次阅读 2019-02-27 10:35:15
    索引是一将数据库中单列或者多列的值进行排序的结构。应用索引可以大幅度提高查询的速度。 用户通过索引查询数据,不但可以提高查询速度,也可以降低服务器的负载。用户查询数据时,系统可以不必遍历表中的所有...

    索引是一种将数据库中单列或者多列的值进行排序的结构。应用索引可以大幅度提高查询的速度。

    用户通过索引查询数据,不但可以提高查询速度,也可以降低服务器的负载。用户查询数据时,系统可以不必遍历表中的所有记录,而是查询索引列。

    但是,凡事都有双面性。对于依赖关系的子表和附表之间的联合查询时,使用索引可以提高查询速度,并且可以提高整体的系统性能。但是创建索引和维护需要耗费时间,并且该耗费时间与数据量的大小成正比;另外,索引需要占用物理空间,给数据的维护造成很多麻烦。

    整体来说,索引可以提高查询的速度,但是会影响用户操作数据库的插入操作。因为向右索引的表中插入记录时,数据库系统会按照索引进行排序。所以,用户可以将索引删除后,插入数据,当数据插入操作完成后可以重新创建索引。

     

    正题:MySQL索引分类

    MySQL索引包括普通索引、唯一索引、全文索引、单列索引、多列索引、空间索引

    1、普通索引

    即不应用任何限制条件的索引,该索引可以在任何数据类型中创建。字段本身的约束条件可以判断其值是否为空或唯一。

    2、唯一索引

    使用UNIQUE参数可以设置唯一索引。创建该索引时,索引的值必须唯一。主键是一种特殊唯一索引。

    3、全文索引

    使用FULLTEXT参数可以设置全文索引。全文索引只能创建在CHAR、VARCHAR、TEXT类型的字段上。查询数据量较大的字符串类型字段时,使用全文索引可以提高查询速度。注意:全文索引在默认情况下是对大小写字母不敏感的,可以通过使用二进制对索引的列进行排序以执行大小写敏感的全文索引。MySQL中只有MyISAM存储引擎支持全文索引

    4、单列索引

    顾名思义,单列索引值对应一个字段的索引。可以包括上述的三种索引方式。应用该索引的条件只需要保证该索引值对应一个字段即可。

    5、多列索引

    多列索引是在表的多个字段上创建一个索引。该索引只想创建时对应的多个字段,可以通过这几个字段进行查询。要想应用该索引,用户必须使用这些字段中的第一个字段。

    6、空间索引

    使用SPATIAL参数可以设置控件索引。控件索引只能建立在控件数据类型(LINESTRING、POINT、GEOMETRY等)上,这样可以提高系统获取控件数据的效率。MySQL中只有MyISAM存储引擎支持空间索引,且该字段不能为空值。

     

    (存储引擎部分可以参考文章——常用的mysql存储引擎及其特点

    展开全文
  • 索引失效的几种情况

    千次阅读 多人点赞 2021-06-17 15:55:04
    口诀:带头大哥不能死,中间兄都不能断,索引列上无操作,范围右边全失效,like百分加右边,字符串中引号 准备: 建立员工记录表staffs(id,name,age,pos,add_time) 给表中name,age,pos字段添加索引(注意三个字段的...

    索引失效

    本文参考尚硅谷视频

    口诀:带头大哥不能死,中间兄都不能断,索引列上无操作,范围右边全失效,like百分加右边,字符串中有引号

    准备:

    建立员工记录表staffs(id,name,age,pos,add_time)

    给表中name,age,pos字段添加索引(注意三个字段的顺序)

    alter table staff
    add index idx_staffs_nameAgePos(name,age,pos)
    

    ①最佳左前缀法则

    指的是查询从索引的最左前列开始并且不跳过索引中的列

    (带头大哥不能死,中间兄弟不能断)

    (火车头带着车身跑,不能没有火车头,中间也不能缺少一段火车身)

    例:

    第一种情况,name字段索引一直被使用

    mysql>EXPLAIN SELECT * FROM staffs WHERE NAME = ‘July’

    在这里插入图片描述

    上图可知,idx_staffs_nameAgePos索引有三个字段,name,age,pos

    其中,只查找name可以使用索引

    只查找name和age也可以使用索引

    查找name,age,pos三个字段也可以使用索引

    第二种情况,当不查找name而去查找后面age和pos字段时

    在这里插入图片描述

    索引失效了

    第三种情况,查找了name字段和pos字段,而缺少了中间的age字段

    在这里插入图片描述

    上图对比了分别查找name字段和name,pos字段的两种情况,发现虽然都用到了idx_staffs_nameAgePos索引,但是key_len长度没变,ref索引用到的字段也没变,说明针对字段pos的索引失效了,原因是缺少了中间的age索引字段

    ②不要再索引列上做任何操作

    不要在索引列上左任何操作(计算,函数,自动or手动类型转换),会导致索引失效转换为全表扫描

    例:

    在这里插入图片描述

    上图可以看到,没用left函数之前,是一个正常的索引引用,使用函数之后,索引失效了

    ③存储引擎不能使用索引中范围条件右边的列

    与上面单表索引优化分析中的例子一样

    在这里插入图片描述

    第一个查询全等值匹配没问题

    第二个查询中间使用了范围条件,结果导致manger的索引失效

    按照BTree索引的工作原理,先排序name,如果遇到相同的name则再排序age,如果遇到相同的age则再排序pos,当age字段在复合索引中间时,因age>25条件是一个范围值(所谓range),MySQL无法利用索引再对后面的pos部分进行建索,即range类型查询字段后面的索引无效

    ④尽量使用覆盖索引

    只访问索引列的查询,索引列和查询列一致,避免select *

    在这里插入图片描述

    当只访问了索引列后,Extra中出现了Using index,表明是覆盖查询,这是好的

    ⑤Mysql在使用(<>或!=或is null或is not null)时无法使用索引会导致全表扫描(现在改了)

    注:新版本的MySQL中这些已经可以使用索引了

    在这里插入图片描述

    ⑥like以通配符(%)开头的索引会失效变成全表扫描

    以%开头会失效,变成全表扫描

    通配符出现最前面说明所有都适配,所有都要扫描

    在这里插入图片描述

    不以%开头则不失效

    在这里插入图片描述

    如何解决?

    可以使用覆盖索引

    tb1_user表中有id,name,age,email四个字段,对name,age字段设置索引,id自动为主键索引

    那么查询id,name,age字段都是覆盖索引,都可以使索引生效

    在这里插入图片描述

    但是如果使用explain select * from tb1_user where name like '%aa%'就会索引失效,因为此时不是覆盖索引,不是覆盖索引使用%会失效

    ⑦字符串不加单引号会导致索引失效

    name字段为varchar类型

    假设有一行name=‘2000’,这时如果用name=2000条件查找也会有结果

    在这里插入图片描述

    用EXPLAIN分析

    在这里插入图片描述

    可以看出,用name=2000作为判断条件,不加单引号导致索引失效了,为什么?

    因为name=2000也可以查出来是因为MySQL在底层做了一次类型转换,把整形2000转换成了字符串’2000’

    违背了上面第②条的不要在索引列上左任何操作的原则,所以索引失效了

    练习

    在这里插入图片描述

    2.条件顺序改变

    假设表student中id,name,age三个字段建立了一个复合索引

    那么条件列的顺序换换索引是否还能有效?

    explain select * from student where id = 1 and name = "张三" and age = 22explain select * from student where name = "张三"  and id = 1 and age = 22
    

    答案:yes,M有SQL的优化器会自动给列排序为创建索引时的列,但是还是建议顺序与索引列顺序一致,提高效率

    3.order by 只排序,不查询

    建表test03(c1,c2,c3,c4)

    对c1,c2,c3,c4加复合索引

    在这里插入图片描述

    先是MySQL优化器对where后面的条件进行排序,c1,c2,c3,c4

    由于索引功能有两个,分别是排序与查询,对c3进行排序并没有查询,但也是用到了索引,所以实际上c1,c2,c3都用到了索引,而c4由于c3没有等值判断所以用不到索引,索引对c4失效了。

    4.order by 中的字段顺序不能调换

    在这里插入图片描述

    由order by 的特性可知,order先对c3排序后再对c2排序,所以优化器不会把c3,c2顺序互换,这就导致了最终的是顺序是c1,c3,c2,c5

    只有c1用到了索引,c3与c1中间缺少了c2,所以c3用不到索引,c5本身就没有索引

    所以对c3和c2的排序没有用到内部索引,使用了外部索引Using filesort

    在这里插入图片描述

    这里虽然order by 中是先c3再c2,但是前面条件查询时已经用到了c2,所以实际用到索引的顺序是c1,c2,c3

    所以c1,c2都使用到了索引,ref为两个const,Extra也没有出现Using filesort

    5.group by先排序后分组,用法与order by一样

    6.like的%位置关系

    在这里插入图片描述

    第一条sql语句与第四条效果一样,range范围类型,用到了三个索引列,ref为null

    为什么这里ref为null?明明三个索引都被使用了,前文提到过,range范围后的索引都会失效,但是like是特例,由于%不在第一个位置上,第一个位置上的是k,k是一个确定的值,所以可以算作查询被使用索引,所以能连通c3,c3也能使用索引

    第二条sql语句与第三条效果一样,ref一对多结果,用到了一个索引列,ref为const

    为什么这里ref为const

    因为like后面%在第一个位置上,导致like后面的索引全失效,所以只有c1的索引有效

    小表驱动大表

    5 X 1000 == 1000 X 5 ,但是在数据库中第一种比第二种好,连接5次数据库,每次查1000条,连接1000次数据库,每次查5条,肯定第一种好

    举例:查找华为公司各部门的员工信息(员工表A,部门表B)

    第一种:用in函数(A表数量大于B表,用in,先查in括号里面的少的表)

    select * from A where A.id in (select B.id from B)

    第一步:select B.id from B

    第二步:select * from A where A.id = B.id

    部门表的数量肯定比员工表少,所以用部门表驱动员工表,小表驱动大表

    如果先查员工表,那么需要对员工表进行全表搜索,相比较部门表,肯定效率低

    第二种:用exist函数(B表数量小于A表,先查B表,再判断B表中是否有满足条件的数据)

    select * from B where exists(select 1 from A where A.id = B.id)

    第一步:select * from B

    第二步:select * from B where A.id = B.id

    exist()子查询只返回true或false,因此select 1也可以是任意select * ,官方说法是忽略select清单

    select ... from table where exist(subquery)
    

    该语法可以理解为:将主查询的数据放到子查询中做条件验证,根据验证结果(true或false)来决定主查询的数据结果是否得以保留

    排序优化

    1.order by后面的顺序必须和索引顺序一致,否则会造成使用order by的内部排序(file sort)

    #建表
    create table tblA(
    	#id int primary key not null auto_increment,
    	age int,
    	birth TIMESTAMP not null
    )
    #创建age,birth的索引
    create index idx_tblA_age_birth on tblA(age,birth)
    
    #1.只对age排序,没问题,用上索引
    explain select * from tblA where age > 20 order by age
    #2.先对age排序,再对birth排序,没问题
    explain select * from tblA where age > 20 order by age,birth
    #3.顺序一变,出现了filesort,危险的文件排序,索引失效
    explain select * from tblA where age > 20 order by birth,age
    
    #4.带头大哥age不在了,所以索引失效,用到了索引,是索引失效
    explain select * from tblA where birth > '2021-10-10 00:00:00' order by birth
    #5.带头大哥存在,索引生效
    explain select * from tblA where birth > '2021-10-10 00:00:00' order by age
    #6.age升序,birth降序,打乱了索引的结构,索引失效
    explain select * from tblA order by age asc , birth desc
    

    order by支持两种方式的文件排序,FileSort和index,index效率高,filesort效率低

    能成功使用index的情况:1.满足最左前缀法则2.排序统一

    2.filesort有两种排序算法,可能是单路排序的缓存空间太小导致效率降低

    双路排序(mysql4.1之前):两次扫描磁盘,读取待排序的那一列,I/O非常耗时,所以效率低

    单路排序:从磁盘中读取查询需要的所有列,按照order by在buffer对它们进行排序,然后扫描排序后的列表进行输出。它的效率更快,因为第一次读取数据后放到了缓冲中,把随机I/O变成了顺序I/O,但是会占用更多的内存空间

    单路排序可能出现的问题:

    单路算法总体好于双路算法,但是如果一次读取不完所有数据,会造成多次读取,反而效率还低于多路算法,如果sort_buffer_size比较小,单路排序每次只能取出sort_buffer_size大小的数据,取不完就要多次取。

    多路算法也可能超出缓冲区,但是单路算法的风险更大

    3.order by 排序不要用select *

    因为select * 查询所有的,占用的排序缓冲区太大,在单路算法下,很可能超出缓冲区大小,就会多次I/O读取,降低效率

    show profiles诊断sql

    show profiles:查看之前执行的所有sql及运行时间

    1.先执行一条sql

    select * from emp where id = 4
    

    2.进行show profiles,可以看到刚才执行的那条sql的id为52

    show profiles
    

    请添加图片描述

    3.查看刚才那条语句在内存中详细的运行状态

    show profile cpu,block io for query 52;
    

    请添加图片描述

    常用type

    all: 显示所有的开销信息

    block io: 显示块IO相关开销

    context switches: 上下文切换相关开销

    cpu: cpu相关开销

    ipc: 显示发送和接收相关开销

    memory: 显示内存相关开销信息

    page faults: 显示错误页面相关开销信息

    source: 显示和source_function,source_file,source_line相关的开销信息

    swaps: 显示交换次数相关开销的信息

    如果查询详细的运行状态中有一下四个中的任何一个,必须优化

    1.converting HEAP to MyISAM :查询结果太大,内存不够用了,往磁盘上搬

    2.Create tmp table :创建临时表。(数据拷贝到临时表,用完再删除)

    3.Copying to tmp table on disk:把内存临时表复制到磁盘,危险

    4.locked:锁住了

    展开全文
  • 数据库索引有几种

    千次阅读 2017-08-29 09:31:44
    https://zhidao.baidu.com/question/306752012277622484.html
  • 索引用来快速地寻找那些具有特定值的记录,所有的MySQL索引都以B-树的形式保存。如果没有索引,执行查询的时候MySQL必须从第一个记录开始扫描整个...如果表1000个记录,通过索引查找记录至少比顺序扫描记录快100倍。
  • 创建数据库索引几种方法

    千次阅读 2020-06-20 10:34:31
    1、普通索引 CREATE INDEX indexName ON mytable(username(length)); 创建表的时候直接指定: CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, INDEX [indexName] (username(length)) ); ...
  • MYSQL几种索引,你知道吗?

    万次阅读 2018-12-26 21:40:46
    MySQL目前主要以下几种索引类型: 1.普通索引 2.唯一索引 3.主键索引 4.组合索引 5.全文索引 二、语句 CREATE TABLE table_name[col_name data type][unique|fulltext][index|key][index_name](col_name...
  • MySQL索引优化的几种方式

    千次阅读 2021-11-06 11:22:04
    索引高性能优化 1. 使用独立的索引列 ​ 错误的查询语句会使得索引无效… select user_id from user where user_id-1=4; 第一个例子中,对索引列user_id进行了一次方程运算,然后进行查询,然而这样的操作MySQL...
  • 什么是索引?Mysql目前主要的几种索引类型

    万次阅读 多人点赞 2018-02-27 10:11:16
    一、索引MySQL索引的建立对于MySQL的高效运行是很...单列索引,即一个索引只包含单个列,一个表可以多个单列索引,但这不是组合索引。组合索引,即一个索引包含多个列。创建索引时,你需要确保该索引是应用在 SQ...
  • 索引失效的几种原因

    千次阅读 2021-05-08 18:44:51
    1.隐式类型转换导致索引失效.这一点应当引起重视.也是开发中经常会犯的错误.由于表的字段tu_mdn定义为varchar2(20),但在查询时把该字段作为number类型以where条件传给Oracle,这样会导致索引失效:错误的例子:...
  • 联合索引ABC的几种索引利用情况

    千次阅读 2020-11-09 16:21:53
    可以支持a | a,b| a,b,c 3组合进行查找,但不支持 b,c进行查找 .当最左侧字段是常量引用时,索引就十分有效。 以下是一些例子: (1) select * from myTest where a=3 and b=5 and c=4; ----abc顺序 abc三个索引...
  • MySQL之——添加索引几种方式

    千次阅读 2016-04-08 15:38:54
    1.添加PRIMARY KEY(主键索引) mysql>ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` ) 2.添加UNIQUE(唯一索引) mysql>ALTER TABLE `table_name` ADD UNIQUE ( `column` ) 3.添加INDEX(普通索引) mysql...
  • MySQL索引失效的几种情况

    千次阅读 2021-08-24 19:57:38
    MySQL索引失效的几种情况 1、全值匹配我最爱 (这种情况下索引不会失效) 全值匹配意思就是联立的复合索引的顺序和个数要和检索的条件顺序和个数相同。 2、最佳左前缀法则(重要) 最佳左前缀法则是指,如果索引了多...
  • 索引失效的几种情况和原因剖析

    千次阅读 2020-10-17 19:25:12
    一般我们常见的出现索引失效的这么个原因 1,使用or关键字(但是并不是所有带or的查询都会失效,如果两个字段,两个字段都有索引就不会失效,会走两个索引) 2,使用like关键字(但是并不是所有like查询都会...
  • Mysql目前主要以下几种索引方式:FULLTEXT,HASH,BTREE,RTREE。 那么,这几种索引有什么功能和性能上的不同呢? FULLTEXT 即为全文索引,目前只有MyISAM引擎支持。其可以在CREATE TABLE ,ALTER TABLE ,...
  • Python从列表中找出所有元素索引几种方法

    万次阅读 多人点赞 2019-03-31 09:35:11
    列表中使用index方法获取的只是第一个索引,比如想获取列表中的字符'A' >>> lst = ['A', 1, 4, 2, 'A', 3] >>> lst.index('A') 0 如果想获取所有'A'元素的索引列表,可以借助于下面的方法 ...
  • sql不走索引几种情况

    千次阅读 2020-06-28 15:47:30
    index 全索引扫描 rang 部分索引 between >,< ref 非唯一索引 eq_ref 唯一索引 const,system 一个匹配 肯定的走索引 union all , between and ,<,> in null and 最多能能一个起效 否定的不走索引 ...
  • 索引是对数据库表中一列或多列的值进行排序的一结构,例如 employee 表的姓(name)列。如果要按姓查找特定职员,与必须搜索表中的所有行相比,索引会帮助您更快地获得该信息。 索引是一个单独的、物理的数据库...
  • MySQL索引失效的几种情况汇总

    千次阅读 2021-01-18 20:19:54
    索引不存储null值更准确的说,单列索引不存储null值,复合索引不存储全为null的值。索引不能存储Null,所以对这列采用is null条件时,因为索引上根本没Null值,不能利用到索引,只能全表扫描。为什么索引列不能存...
  • SQL不走索引几种常见情况

    万次阅读 2019-07-01 15:39:49
    我们写的SQL语句很多时候where条件用到了添加索引的列,但是却没有走索引,在网上找了资料,发现不是很准确,所以自己验证了一下,记一下笔记。 这里实验数据库为 MySQL(oracle也类似)。 查看表的索引的语句: ...
  • 以下几种情况就会导致索引失效: 1. 没有 WHERE 子句 众所周知,添加索引的字段必需要在where条件后适当使用才会生效,如果连查询条件都没有,那肯定不会用到索引的。 2. 使用 IS NULL 和 IS NOT NULL select ...
  • 索引几种算法

    千次阅读 2018-04-20 15:19:17
    数据库mysql索引:使用B树索引下面介绍一下B树索引:Lucene全文检索使用:二分查找下面介绍一下二分查找:二分查找也称折半查找(Binary Search),它是一效率较高的查找方法。但是,折半查找要求线性表必须采用...
  • 假如你的T表上一个包含Y值的组合索引,但是优化器会认为需要一行行的扫描会更有效,这个时候,优化器可能会选择TABLE ACCESS FULL,但是如果换成了SELECT Y FROM T WHERE Y = XXX,优化器会直接去索引中...
  • 数据库索引失效的几种情况

    千次阅读 2020-04-20 15:48:08
    一、什么是索引索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。如果想按特定职员的姓来...二、索引失效的几种情况 1.如果条件中多个字段使用or,即使其...
  • 数据库创建索引几种方法

    万次阅读 多人点赞 2018-11-09 10:46:26
    1、普通索引  CREATE INDEX indexName ON mytable(username(length));  创建表的时候直接指定:  CREATE TABLE mytable(  ID INT NOT NULL,   username VARCHAR(16) NOT NULL,   INDEX [indexName] (.....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 688,411
精华内容 275,364
关键字:

列表的索引有几种