当前位置:首页 » 操作系统 » 数据库索引使用

数据库索引使用

发布时间: 2023-07-15 06:03:33

数据库基础:讲解Mysql索引的概念及数据库索引的应用[2]

五 索引分类

直接创建索引和间接创建索引

直接创建索引 CREATE INDEX mycolumn_index ON mytable (myclumn)

间接创建索引 定义主键约束或者唯一性键约束 可以间接创建索引

普通索引和唯一性索引

普通索引 CREATE INDEX mycolumn_index ON mytable (myclumn)

唯一性索引 保证在索引列中的全部数据是唯一的 对聚簇索引和非聚簇索引都可以使用

CREATE UNIQUE COUSTERED INDEX myclumn_cindex ON mytable(mycolumn)

单个索引和复合索引

单个索引 即非复合索引

复合索引 又叫组合索引 在索引建立语句中同时包含多个字段名 最多 个字段

CREATE INDEX name_index ON username(firstname lastname)

聚簇索引和非聚簇索引(聚集索引 群集索引)

聚簇索引 物理索引 与基表的物理顺序相同 数据值的顺序总是按照顺序排列

CREATE CLUSTERED INDEX mycolumn_cindex ON mytable(mycolumn) WITH

ALLOW_DUP_ROW(允许有重复记录的聚簇索引)

非聚簇索引 CREATE UNCLUSTERED INDEX mycolumn_cindex ON mytable(mycolumn)

六 索引的使用

当字段数据更新频率较低 查询使用频率较高并且存在大量重复值是建议备裂使用聚簇索引

经常同时存取多列 且每列都含有重复值可考虑建立组合索引

复合索引的前导列一定好控制好 否则无法起到索引的效果 如果查询时前导列不在查询条件中则该复合索引不会被使用 前导列一定是使用最频繁的列

多表操作在被实际执行前 查询优化器会根据连接条件 列出几组可能的连接方案并从中找出系统开销最小的最佳方案 连接条件要充份考虑带有索引的表 行数多的表;内外表的选择可由公式 外层表中的匹配行数*内层表中每一次查找的次数确定 乘积最小为最佳方案

where子句中对列的任何操作结果都是在sql运行时逐列计算得到的 因此它不得不进行表搜索 而没有使用该列上面的索引;如果这些结果在查询编译时就能得到 那么就可以被sql优化器优化 使用索引 避免表搜索(例 select * from record where substring(card_no )=

&& select * from record where card_no like % )任何对列的操作都将导致表扫描 它包括数据库函数 计算表达式等等 查询时要尽可能将操困弯作移至等号右边

where条件中的 in 在逻辑上相当于 or 所以语法分析器会将in ( ′ ′)转化为column= ′ or column= ′来执行 我们期望它会根据每个or子句分别查找 再将结果相加 这样仿尺闭可以利用column上的索引;但实际上它却采用了 or策略 即先取出满足每个or子句的行 存入临时数据库的工作表中 再建立唯一索引以去掉重复行 最后从这个临时表中计算结果 因此 实际过程没有利用column上索引 并且完成时间还要受tempdb数据库性能的影响 in or子句常会使用工作表 使索引失效;如果不产生大量重复值 可以考虑把子句拆开;拆开的子句中应该包含索引

要善于使用存储过程 它使sql变得更加灵活和高效

lishixin/Article/program/MySQL/201311/29603

② 数据库建立索引怎么利用索引查询

1.合理使用索引x0dx0a索引是数据库中重要的数据结构,它的根本目的就是为了提高查询效率。现在大多数的数据库产品都采用IBM最先提出的ISAM索引结构。x0dx0a索唤漏引的使用要恰到好处,其使用原则如下:x0dx0a在经常进行连接,但是没有指定为外键的列上建立索引,而不经常连接的字段则由优化器自动生成索引。x0dx0a在频繁进行排序或分组(即进行group by或order by操作)的列上建立索引。x0dx0a在条件表达式中经常用到的不同值较多的列上建立检索,在不同值少的列上不要建立索引。比如在雇员表的“性别”列上只有“男”与“女”两个不同值,因此就无必要建立索引。如果建立索引不但不会提高查询效率,反而会严重降低更新速度。x0dx0a如果待排序的列有多个,可以在这些列上建立复合索引(compound index)。x0dx0a使用系统工具。如Informix数据库有一个tbcheck工具,可以在可疑的索引上进行检查。在一些数据库服务器上,索引可能失效或者因为频繁操作而 使得读取效率降低,如果一个使用索引的查询不明不白地慢下来,可以试着用tbcheck工具检查索引的完整性,必要时进行修复。另外,当数据库表更新大量 数据后,删除并重建索引可以提高查询速度。x0dx0a(1)在下面两条select语句中:x0dx0aSELECT * FROM table1 WHERE field1<=10000 AND field1>=0; x0dx0aSELECT * FROM table1 WHERE field1>=0 AND field1<=10000;x0dx0a如果数据表中的数据field1都>=0,则第一条select语句要比第二条select语句效率高的多,因为第二条select语句的第一个条件耗费了大量的系统资源。x0dx0a第一个原则:在where子句中应把最具限制性的条件放在最前面。x0dx0a(2)在下面的select语句中:x0dx0aSELECT * FROM tab WHERE a=? AND b=? AND c=?;x0dx0a若有索引index(a,b,c),则where子句中字段的顺序应和索引中字段顺序一致。x0dx0a第二个原则:where子句中字段的顺序应和索引中字段顺序一致。x0dx0a—————————————————————————— x0dx0a以下假设在field1上有唯一索引I1,在field2上有非唯一索引I2。 x0dx0a—————————————喊链段————————————— x0dx0a(3) SELECT field3,field4 FROM tb WHERE field1='sdf' 快 x0dx0aSELECT * FROM tb WHERE field1='sdf' 慢[/cci]x0dx0a因为后者在索引扫描后要多一步ROWID表访问。x0dx0a(4) SELECT field3,field4 FROM tb WHERE field1>='sdf' 快 x0dx0aSELECT field3,field4 FROM tb WHERE field1>'sdf' 慢x0dx0a因为前者可以迅速定位索引。x0dx0a(5) SELECT field3,field4 FROM tb WHERE field2 LIKE 'R%' 快 x0dx0aSELECT field3,field4 FROM tb WHERE field2 LIKE '%R' 慢,x0dx0a因为后者不使用索引。x0dx0a(6) 使用函郑誉数如: x0dx0aSELECT field3,field4 FROM tb WHERE upper(field2)='RMN'不使用索引。x0dx0a如果一个表有两万条记录,建议不使用函数;如果一个表有五万条以上记录,严格禁止使用函数!两万条记录以下没有限制。x0dx0a(7) 空值不在索引中存储,所以 x0dx0aSELECT field3,field4 FROM tb WHERE field2 IS[NOT] NULL不使用索引。x0dx0a(8) 不等式如 x0dx0aSELECT field3,field4 FROM tb WHERE field2!='TOM'不使用索引。 x0dx0a相似地, x0dx0aSELECT field3,field4 FROM tb WHERE field2 NOT IN('M','P')不使用索引。x0dx0a(9) 多列索引,只有当查询中索引首列被用于条件时,索引才能被使用。x0dx0a(10) MAX,MIN等函数,使用索引。 x0dx0aSELECT max(field2) FROM tb 所以,如果需要对字段取max,min,sum等,应该加索引。x0dx0a一次只使用一个聚集函数,如: x0dx0aSELECT “min”=min(field1), “max”=max(field1) FROM tb x0dx0a不如:SELECT “min”=(SELECT min(field1) FROM tb) , “max”=(SELECT max(field1) FROM tb)x0dx0a(11) 重复值过多的索引不会被查询优化器使用。而且因为建了索引,修改该字段值时还要修改索引,所以更新该字段的操作比没有索引更慢。x0dx0a(12) 索引值过大(如在一个char(40)的字段上建索引),会造成大量的I/O开销(甚至会超过表扫描的I/O开销)。因此,尽量使用整数索引。 Sp_estspace可以计算表和索引的开销。x0dx0a(13) 对于多列索引,ORDER BY的顺序必须和索引的字段顺序一致。x0dx0a(14) 在sybase中,如果ORDER BY的字段组成一个簇索引,那么无须做ORDER BY。记录的排列顺序是与簇索引一致的。x0dx0a(15) 多表联结(具体查询方案需要通过测试得到) x0dx0awhere子句中限定条件尽量使用相关联的字段,且尽量把相关联的字段放在前面。 x0dx0aSELECT a.field1,b.field2 FROM a,b WHERE a.field3=b.field3x0dx0afield3上没有索引的情况下: x0dx0a对a作全表扫描,结果排序 x0dx0a对b作全表扫描,结果排序 x0dx0a结果合并。 x0dx0a对于很小的表或巨大的表比较合适。x0dx0afield3上有索引 x0dx0a按照表联结的次序,b为驱动表,a为被驱动表 x0dx0a对b作全表扫描 x0dx0a对a作索引范围扫描 x0dx0a如果匹配,通过a的rowid访问x0dx0a(16) 避免一对多的join。如: x0dx0aSELECT tb1.field3,tb1.field4,tb2.field2 FROM tb1,tb2 WHERE tb1.field2=tb2.field2 AND tb1.field2=‘BU1032’ AND tb2.field2= ‘aaa’ x0dx0a不如: x0dx0adeclare @a varchar(80) x0dx0aSELECT @a=field2 FROM tb2 WHERE field2=‘aaa’ x0dx0aSELECT tb1.field3,tb1.field4,@a FROM tb1 WHERE field2= ‘aaa’x0dx0a(16) 子查询 x0dx0a用exists/not exists代替in/not in操作 x0dx0a比较: x0dx0aSELECT a.field1 FROM a WHERE a.field2 IN(SELECT b.field1 FROM b WHERE b.field2=100) x0dx0aSELECT a.field1 FROM a WHERE EXISTS( SELECT 1 FROM b WHERE a.field2=b.field1 AND b.field2=100) x0dx0aSELECT field1 FROM a WHERE field1 NOT IN( SELECT field2 FROM b) x0dx0aSELECT field1 FROM a WHERE NOT EXISTS( SELECT 1 FROM b WHERE b.field2=a.field1)x0dx0a(17) 主、外键主要用于数据约束,sybase中创建主键时会自动创建索引,外键与索引无关,提高性能必须再建索引。x0dx0a(18) char类型的字段不建索引比int类型的字段不建索引更糟糕。建索引后性能只稍差一点。x0dx0a(19) 使用count(*)而不要使用count(column_name),避免使用count(DISTINCT column_name)。x0dx0a(20) 等号右边尽量不要使用字段名,如: x0dx0aSELECT * FROM tb WHERE field1 = field3x0dx0a(21) 避免使用or条件,因为or不使用索引。x0dx0a2.避免使用order by和group by字句。x0dx0a因为使用这两个子句会占用大量的临时空间(tempspace),如果一定要使用,可用视图、人工生成临时表的方法来代替。 x0dx0a如果必须使用,先检查memory、tempdb的大小。 x0dx0a测试证明,特别要避免一个查询里既使用join又使用group by,速度会非常慢!x0dx0a3.尽量少用子查询,特别是相关子查询。因为这样会导致效率下降。x0dx0a一个列的标签同时在主查询和where子句中的查询中出现,那么很可能当主查询中的列值改变之后,子查询必须重新查询一次。查询嵌套层次越多,效率越低,因此应当尽量避免子查询。如果子查询不可避免,那么要在子查询中过滤掉尽可能多的行。x0dx0a4.消除对大型表行数据的顺序存取x0dx0a在 嵌套查询中,对表的顺序存取对查询效率可能产生致命的影响。 x0dx0a比如采用顺序存取策略,一个嵌套3层的查询,如果每层都查询1000行,那么这个查询就要查询 10亿行数据。 x0dx0a避免这种情况的主要方法就是对连接的列进行索引。 x0dx0a例如,两个表:学生表(学号、姓名、年龄??)和选课表(学号、课程号、成绩)。如果两个 表要做连接,就要在“学号”这个连接字段上建立索引。 x0dx0a还可以使用并集来避免顺序存取。尽管在所有的检查列上都有索引,但某些形式的where子句强迫优化器使用顺序存取。 x0dx0a下面的查询将强迫对orders表执行顺序操作: x0dx0aSELECT * FROM orders WHERE (customer_num=104 AND order_num>1001) OR order_num=1008 x0dx0a虽然在customer_num和order_num上建有索引,但是在上面的语句中优化器还是使用顺序存取路径扫描整个表。因为这个语句要检索的是分离的行的集合,所以应该改为如下语句: x0dx0aSELECT * FROM orders WHERE customer_num=104 AND order_num>1001 x0dx0aUNION x0dx0aSELECT * FROM orders WHERE order_num=1008 x0dx0a这样就能利用索引路径处理查询。x0dx0a5.避免困难的正规表达式x0dx0aMATCHES和LIKE关键字支持通配符匹配,技术上叫正规表达式。但这种匹配特别耗费时间。例如:SELECT * FROM customer WHERE zipcode LIKE “98_ _ _” x0dx0a即使在zipcode字段上建立了索引,在这种情况下也还是采用顺序扫描的方式。如果把语句改为SELECT * FROM customer WHERE zipcode >“98000”,在执行查询时就会利用索引来查询,显然会大大提高速度。 x0dx0a另外,还要避免非开始的子串。例如语句:SELECT * FROM customer WHERE zipcode[2,3] >“80”,在where子句中采用了非开始子串,因而这个语句也不会使用索引。x0dx0a6.使用临时表加速查询x0dx0a把表的一个子集进行排序并创建临时表,有时能加速查询。它有助于避免多重排序操作,而且在其他方面还能简化优化器的工作。例如: x0dx0aSELECT cust.name,rcvbles.balance,??other COLUMNS x0dx0aFROM cust,rcvbles x0dx0aWHERE cust.customer_id = rcvlbes.customer_id x0dx0aAND rcvblls.balance>0 x0dx0aAND cust.postcode>“98000” x0dx0aORDER BY cust.name x0dx0a如果这个查询要被执行多次而不止一次,可以把所有未付款的客户找出来放在一个临时文件中,并按客户的名字进行排序: x0dx0aSELECT cust.name,rcvbles.balance,??other COLUMNS x0dx0aFROM cust,rcvbles x0dx0aWHERE cust.customer_id = rcvlbes.customer_id x0dx0aAND rcvblls.balance>;0 x0dx0aORDER BY cust.name x0dx0aINTO TEMP cust_with_balance x0dx0a然后以下面的方式在临时表中查询: x0dx0aSELECT * FROM cust_with_balance x0dx0aWHERE postcode>“98000” x0dx0a临时表中的行要比主表中的行少,而且物理顺序就是所要求的顺序,减少了磁盘I/O,所以查询工作量可以得到大幅减少。 x0dx0a注意:临时表创建后不会反映主表的修改。在主表中数据频繁修改的情况下,注意不要丢失数据。x0dx0a7.用排序来取代非顺序存取x0dx0a非顺序磁盘存取是最慢的操作,表现在磁盘存取臂的来回移动。SQL语句隐藏了这一情况,使得我们在写应用程序时很容易写出要求存取大量非顺序页的查询。

③ 在SQLServer中使用索引的技巧

在SQL Server中 为了查询性能的优化 有时我们就需要对数据表通过建立索引的方式 目的主要是根据查询要求 迅速缩小查询范围 避免全表扫描

索引有两种类型 分别是聚集索引(clustered index 也称聚类索引 簇集索引)和非聚集索引(nonclustered index 也称非聚类索引 非簇集索引)

聚集索引在一个表中只能有一个 默认情况下在主键建立的时候创建 它是规定数据在表中的物理存储顺序 我们也可以取消主键的聚集索引 所以必须考虑数据库可能用到的查询类型以及使用的最为频繁的查询类型 对其最常用的一个字段或者多个字段建立聚集索引或者组合的聚集索引 它就是SQL Server会在物理上按升序(默认)或者降序重排数据列 这样就可以迅速的找到被查询的数据

非聚集索主要是数据存储在一个地方 索引存储在另一个地方 索引带有指针指向数据的存储位置 索引中的项目按索引键值的顺序存储 而表中的信息按另一种顺序存储 可以在一个表格中使用高达 个非聚集的索引 在查询的过程中先对非聚集索引进行搜索 找到数据值在表中的位置 然后从该位置直接检索数据 这使非聚集索引成为精确匹配查询的最佳方法 因为索引包含描述查询所搜索的数据值在表中的精确位置的条目

所以我们在选择创建聚集索引的时候要注意以下几个方面

) 对表建立主键时 就会为主键自动添加了聚集索引 如自动编号字段 而我们没有必要把聚集索引浪费在主键上 除非你只按主键查询 所以会把聚集索引设置在按条件查询频率最高的那个字段或者组合的字段

) 索引的建立要根据实际应用的需求来进行 并非是在任何字段上建立索引就能提高查询速度 聚集索引建立遵循下面几个原则

包含大量非重复值的列

使用下列运算符返回一个范围值的查询 BEEEN > >= < 和 <=

被连续访问的列

返回大型结果集的查询

经常被使用联接或 GROUP BY 子句的查询访问的列;一般来说 这些是外键列 对ORDER BY 或 GROUP BY 子句中指定的列进行索引 可以使 SQL Server 不必对数据进行排序 因为这些行已经排序 这样可以提高查询性能

OLTP 类型的应用程序 这些程序要求进行非常快速的单行查找(一般通过主键) 应在主键上创建聚集索引

举例来说 银行交易日志中对交易日期建立聚合索引 数据物理上按顺序存于数据页上 重复值也排列在一起 因而在范围查找时 可以先找到这个范围的起末点 且只在这个范围内扫描数据页 避免了大范围扫描 提高了查询速度 而如果我们对员工的基本信息表中性别的字段列上建立聚集索引 就完全没有必要 因为内容里只涉及到 男 与 女 两个不同值

) 在聚集索引中按常用的组合字段建立索引 形成复合索引 一般在为表建立多个主键的时候就会产生 如果一个表中的数据在查询时有多个字段总是同时出现则这些字段就可以作为复合索引 这样能形成索引覆盖 提高where语句的查询效率

)索引对查询有一这的优化 但由于改变一个表的内容 将会引起索引的变化 频繁的对数据操作如insert update delete语句将导致系统花费较大的代价进行索引更新 引起整体性能的下降 一般来讲 在对查询性能的要求高于对数据维护性能要求时 应该尽量使用索引 有时在这种操作数据库比较频繁的某些极端情况下 可先删除索引 再对数据库表更新大量数据 最后再重建索引 新建立的索引总是比较好用

索引在使用了长久的时候 就会产生很多的碎片 查询的性能就会受到影响 这时候有两种方法解决 一是利用DBCC INDEXDEFRAG整理索引碎片 还有就是利用DBCC DBREINDEX重建索引

DBCC INDEXDEFRAG 命令是联机操作 所以索引只有在该命令正在运行时才可用 而且可以在不丢失已完成工作的情况下中断该操作 这种方法的缺点是在重新组织数据方面没有聚集索引的除去/重新创建操作有效

重新创建聚集索引将对数据进行重新组织 其结果是使数据页填满 填满程度可以使用 FILLFACTOR 选项进行配置 这种方法的缺点是索引在除去/重新创建周期内为脱机状态 并且操作属原子级 如果中断索引创建 则不会重新创建该索引

我们来看看索引重建使用的方法

语法 DBCC DBREINDEX ( [ TableName [ index_name [ fillfactor ] ] ] )

参数 TableName

是要重建其指定的索引的表名 数据库 所有者和表名必须符合标识符的规则 有关更多信息 请参见使用标识符 如果提供 database 或 owner 部分 则必须使用单引号 ( )

将整个 database owner table_name 括起来 如果只指定 table_name 则不需要单引号

index_name 是要重建的索引名 索引名必须符合标识符的规则 如果未指定 index_name 或指定为 就要对表的所有索引进行重建

fillfactor 是创建索引时每个索引页上要用于存储数据的空间百分比 fillfactor替换起始填充因子以作为索引或任何其它重建的非聚集索引(因为已重建聚集索引)的新默认值 如果 fillfactor 为 DBCC DBREINDEX 在创建索引时将使用指定的起始fillfactor

我们在查询分析器中输入如下的命令

DBCC DBREINDEX ( MyTable )

lishixin/Article/program/SQLServer/201311/22210

④ 数据库表如何建立索引

可以建立索引的;至于建立聚集索引或者是非聚集索引,那要看你这个时间字段的具体情况以及使用或变更频繁程带清度

一般来说,适合建立聚集索引的要求:“既不能绝大多数都相同顷行基,又雀谨不能只有极少数相同”的规则

先说说一个误区:有人认为:只要建立索引就能显着提高查询速度

这个想法是很错误的

建立非聚集索引,确实,一般情况下可以提高速度,但是一般并不会达到你想要的速度

只有在适当的列建立适当的(聚集)索引,才能达到满意的效果

下面的表总结了何时使用聚集索引或非聚集索引(很重要)

动作描述 使用聚集索引 使用非聚集索引列经常被分组排序 应应返回某范围内的数据 应 不应一个或极少不同值 不应 不应小数目的不同值 应 不应大数目的不同值 不应 应频繁更新的列 不应 应外键列 应应主键列 应应频繁修改索引列 不应 应别的就要看你的理解了

⑤ navicat如何添加索引如何使用Navicat为数据库表建立索引

打开Navicat

打开数据表所在的数据库,右击需要新增字段的数据库表,然后点击【设计表】

此时进入表链带设计界面

点击【索引】标签页,输入索引名称,如newindex

字段选择对话框中选择要索引的字段,如code字段,然后点击【确定】

选毁模择棚余芦索引类型,如unique

热点内容
编程器资源 发布:2025-03-16 17:59:48 浏览:903
加密软件厂商 发布:2025-03-16 17:59:44 浏览:680
鱼钩怎么样配置 发布:2025-03-16 17:59:04 浏览:157
安卓手机怎么设置快点 发布:2025-03-16 17:45:35 浏览:331
c语言字符串右对齐 发布:2025-03-16 17:42:35 浏览:131
充值钓鱼源码 发布:2025-03-16 17:28:16 浏览:470
密码锁锁住了怎么办 发布:2025-03-16 17:25:51 浏览:297
中国移动数据库 发布:2025-03-16 17:18:14 浏览:605
php二维数组函数 发布:2025-03-16 17:16:11 浏览:376
安卓系统在哪里换鸿蒙界面 发布:2025-03-16 17:15:38 浏览:866