经常在查询中作为where条件的字段,经常作为连表查询的条件字段都应该加索引,不论数据量多少,都应该事先加好索引
Ⅱ sql语句中什么时候可以用索引什么时候不可以用
楼上的说的正确:那我就给你个例子把---use students --<指定库名>go/*--检查数据库是否存在索引(索引放在系统表中sysindexes中)--*/if exists(select name from sysindexes where name ='IX_stu_writtenexam') --<表名 --字段>drop index stu .IX_stu_writtenexam --如果存在删除索引gocreate nonclustered index ix_stu_writtenexam --创建非聚居索引 on stu(wriittenexam) with fillfactor =20 --填充因子go
Ⅲ sql哪些地方用到索引
你在一个字段或者函数上建立了索引,你不需要刻意去探究怎么去使用这个索引,这个索引是给数据库系统用的,比如你在person表的id上建立了索引,你使用select * from person的时候系统就会自己去使用索引你会发现你返回结果的时间缩短了很多
Ⅳ sql 什么时候用聚集索引和非聚集索引
1 聚集索引:该索引中键值的逻辑顺序决定了表中相应行的物理顺序。
聚集索引确定表中数据的物理顺序。聚集索引类似于电话簿,后者按姓氏排列数据。由于聚集索引规定数据在表中的物理存储顺序,因此一个表只能包含一个聚集索引。但该索引可以包含多个列(组合索引),就像电话簿按姓氏和名字进行组织一样。
2 聚集索引使用注意事项
定义聚集索引键时使用的列越少越好。
• 包含大量非重复值的列。
.• 使用下列运算符返回一个范围值的查询:BETWEEN、>、>=、< 和 <=。
• 被连续访问的列。
• 回大型结果集的查询。
• 经常被使用联接或 GROUP BY 子句的查询访问的列;一般来说,这些是外键列。对 ORDER BY 或
GROUP BY 子句中指定的列进行索引,可以使 SQL Server 不必对数据进行排序,因为这些行已经排序。这样可以提高查询性能。
• OLTP 类型的应用程序,这些程序要求进行非常快速的单行查找(一般通过主键)。应在主键上创建聚集索引。
3 聚集索引不适用于:
• 频繁更改的列 。这将导致整行移动(因为 SQL Server
必须按物理顺序保留行中的数据值)。这一点要特别注意,因为在大数据量事务处理系统中数据是易失的。
• 宽键 。来自聚集索引的键值由所有非聚集索引作为查找键使用,因此存储在每个非聚集索引的叶条目内。
4 非聚集索引:数据存储在一个地方,索引存储在另一个地方,索引带有指针指向数据的存储位置。
非聚集索引中的项目按索引键值的顺序存储,而表中的信息按另一种顺序存储(这可以由聚集索引规定)。对于非聚集索引,可以为在表非聚集索引中查找数据时常
用的每个列创建一个非聚集索引。有些书籍包含多个索引。例如,一本介绍园艺的书可能会包含一个植物通俗名称索引,和一个植物学名索引
Ⅳ sql中索引有什么用
索引用来提高读取数据的速度。
比如你要从一个有一万条记录的表中读取记录,那么如果有索引,他会通过索引定位,找到你要找的记录,速度比一个一个记录的扫描表快很多很多倍。
表的某一个列可以建立索引,也可以是几个列一起建立索引。
索引有主键索引、唯一性索引等。
主键的索引是默认的,不能删除。
你可以先看看数据结构->排序,查找,B-Tree,red-black tree等内容。然后看看数据库系统原理的一些基本概念,不用全看懂。然后下载MySQL数据库,安装,写一些测试程序,往表里写个百八十万条记录,然后查询。。。
Ⅵ mysql数据库中什么时候加索引
字段添加索引的语句可以网络找 mysql 添加索引命令。
索引的好处在于可以讲指定列进行排序,提高检索的速度。
一个简单的例子:
某个列的数据是
id name
12 小李
10 小龙
5 小青
99 小红
id列创建索引后就会生成一个索引表
id index
5 3
10 2
12 1
99 4
当查询 where id =10的 时候,使用到索引表。由于10下面是15,不可能有大于10的数。所以不再进行扫描表操作。返回第二条数据,对应回主表的第二行。
这样就提高了查询的速度,如果没添加索引;则扫描整张主表。
索引的类型,什么列需要加索引等相关信息的你还需网络查询一下,这里告诉你的是一些基本的概念。
Ⅶ sql 什么时候用聚集索引和非聚集索引
1
聚集索引:该索引中键值的逻辑顺序决定了表中相应行的物理顺序。
聚集索引确定表中数据的物理顺序。聚集索引类似于电话簿,后者按姓氏排列数据。由于聚集索引规定数据在表中的物理存储顺序,因此一个表只能包含一个聚集索引。但该索引可以包含多个列(组合索引),就像电话簿按姓氏和名字进行组织一样。
2
聚集索引使用注意事项
定义聚集索引键时使用的列越少越好。
•
包含大量非重复值的列。
.•
使用下列运算符返回一个范围值的查询:BETWEEN、>、>=、<
和
<=。
•
被连续访问的列。
•
回大型结果集的查询。
•
经常被使用联接或
GROUP
BY
子句的查询访问的列;一般来说,这些是外键列。对
ORDER
BY
或
GROUP
BY
子句中指定的列进行索引,可以使
SQL
Server
不必对数据进行排序,因为这些行已经排序。这样可以提高查询性能。
•
OLTP
类型的应用程序,这些程序要求进行非常快速的单行查找(一般通过主键)。应在主键上创建聚集索引。
3
聚集索引不适用于:
•
频繁更改的列
。这将导致整行移动(因为
SQL
Server
必须按物理顺序保留行中的数据值)。这一点要特别注意,因为在大数据量事务处理系统中数据是易失的。
•
宽键
。来自聚集索引的键值由所有非聚集索引作为查找键使用,因此存储在每个非聚集索引的叶条目内。
4
非聚集索引:数据存储在一个地方,索引存储在另一个地方,索引带有指针指向数据的存储位置。
非聚集索引中的项目按索引键值的顺序存储,而表中的信息按另一种顺序存储(这可以由聚集索引规定)。对于非聚集索引,可以为在表非聚集索引中查找数据时常
用的每个列创建一个非聚集索引。有些书籍包含多个索引。例如,一本介绍园艺的书可能会包含一个植物通俗名称索引,和一个植物学名索引
Ⅷ 数据库在什么时候会用到索引
1) 基本正确,另外有些db软件有高级用法,可以强制指定使用索引(查询路径)。。
2)不使用的话,自然没必要访问索引,因为再走索引就多此一举了。
3)主键是索引。
Ⅸ 在SQL中怎样用指定索引查询
一般来说在条件中使用索引对应的第一个字段就可能会用到该索引。
微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引、簇集索引)和非聚集索引(nonclustered index,也称非聚类索引、非簇集索引)。
索引是数据库中重要的数据结构,它的根本目的就是为了提高查询效率。现在大多数的数据库产品都采用IBM最先提出的ISAM索引结构。
数据搜索实现角度
索引也是另外一类文件/记录,它包含着可以指示出相关数据记录的各种记录。其中,每一索引都有一个相对应的搜索码,字符段的任意一个子集都能够形成一个搜索码。这样,索引就相当于所有数据目录项的一个集合,它能为既定的搜索码值的所有数据目录项提供定位所需的各种有效支持。
以上内容参考:网络-数据库索引
Ⅹ 分析SQL执行过程中,哪些SQL条件会走索引
这样回答你,以下几种情况sql中索引不会被用到
1、查询谓词没有使用索引的主要边界,换句话说就是select *,可能会导致不走索引。
比如,你查询的是SELECT * FROM T WHERE Y=XXX;假如你的T表上有一个包含Y值的组合索引,但是优化器会认为需要一行行的扫描会更有效,这个时候,优化器可能会选择TABLE ACCESS FULL,但是如果换成了SELECT Y FROM T WHERE Y = XXX,优化器会直接去索引中找到Y的值,因为从B树中就可以找到相应的值。
2、单键值的b树索引列上存在null值,导致COUNT(*)不能走索引。
如果在B树索引中有一个空值,那么查询诸如SELECT COUNT(*) FROM T 的时候,因为HASHSET中不能存储空值的,所以优化器不会走索引,有两种方式可以让索引有效,一种是SELECT COUNT(*) FROM T WHERE XXX IS NOT NULL或者把这个列的属性改为not null (不能为空)。
3、索引列上有函数运算,导致不走索引
如果在T表上有一个索引Y,但是你的查询语句是这样子SELECT * FROM T WHERE FUN(Y) = XXX。这个时候索引也不会被用到,因为你要查询的列中所有的行都需要被计算一遍,因此,如果要让这种sql语句的效率提高的话,在这个表上建立一个基于函数的索引,比如CREATE INDEX IDX FUNT ON T(FUN(Y));这种方式,等于Oracle会建立一个存储所有函数计算结果的值,再进行查询的时候就不需要进行计算了,因为很多函数存在不同返回值,因此必须标明这个函数是有固定返回值的。
4、隐式转换导致不走索引。
索引不适用于隐式转换的情况,比如你的SELECT * FROM T WHERE Y = 5 在Y上面有一个索引,但是Y列是VARCHAR2的,那么Oracle会将上面的5进行一个隐式的转换,SELECT * FROM T WHERE TO_NUMBER(Y) = 5,这个时候也是有可能用不到索引的。
5、表的数据库小或者需要选择大部分数据,不走索引
在Oracle的初始化参数中,有一个参数是一次读取的数据块的数目,比如你的表只有几个数据块大小,而且可以被Oracle一次性抓取,那么就没有使用索引的必要了,因为抓取索引还需要去根据rowid从数据块中获取相应的元素值,因此在表特别小的情况下,索引没有用到是情理当中的事情。
6、cbo优化器下统计信息不准确,导致不走索引
很长时间没有做表分析,或者重新收集表状态信息了,在数据字典中,表的统计信息是不准确的,这个情况下,可能会使用错误的索引,这个效率可能也是比较低的。
7、!=或者<>(不等于),可能导致不走索引,也可能走 INDEX FAST FULL SCAN
例如select id from test where id<>100
8、表字段的属性导致不走索引,字符型的索引列会导致优化器认为需要扫描索引大部分数据且聚簇因子很大,最终导致弃用索引扫描而改用全表扫描方式,
由于字符型和数值型的在insert的时候排序不同,字符类型导致了聚簇因子很大,原因是插入顺序与排序顺序不同。详细点说,就是按照数字类型插入(1..3200000),按字符类型('1'...'32000000')t排序,在对字符类型使用大于运算符时,会导致优化器认为需要扫描索引大部分数据且聚簇因子很大,最终导致弃用索引扫描而改用全表扫描方式。