实验六:创建和优化索引

实验六:创建和优化索引
实验六:创建和优化索引

mysql数据库索引优化

我们首先讨论索引,因为它是加快查询的最重要的工具。还有其他加快查询的[url=javascript:;]技术[/url],但是最有效的莫过于恰当地使用索引了。在MySQL 的邮件清单上,人们通常询问关于使查询更快的问题。在大量的案例中,都是因为表上没有索引,一般只要加上索引就可以立即解决问题。但这样也并非总是有效,因为优化并非总是那样简单。然而,如果不使用索引,在许多情形下,用其他手段改善性能只会是浪费时间。应该首先考虑使用索引取得最大的性能改善,然后再寻求其他可能有帮助的技术。 本节介绍索引是什么、它怎样改善查询性能、索引在什么情况下可能会降低性能,以及怎样为表选择索引。下一节,我们将讨论MySQL 的查询优化程序。除了知道怎样创建索引外,了解一些优化程序的知识也是有好处的,因为这样可以更好地利用所创建的索引。某些编写查询的方法实际上会妨碍索引的效果,应该避免这种情况出现。(虽然并非总会这样。有时也会希望忽略优化程序的作用。我们也将介绍这些情况。) 索引对单个表查询的影响 索引被用来快速找出在一个列上用一特定值的行。没有索引,MySQL不得不首先以第一条记录开始并然后读完整个表直到它找出相关的行。表越大,花费时间越多。如果表对于查询的列有一个索引,MySQL能快速到达一个位置去搜寻到数据文件的中间,没有必要考虑所有数据。如果一个表有1000 行,这比顺序读取至少快100倍。注意你需要存取几乎所有1000行,它较快的顺序读取,因为此时我们避免磁盘寻道。 例如对下面这样的一个student表: mysql>SELECT * FROM student +------+---------+---------+---------+---------+ | id | name | english | chinese | history | +------+---------+---------+---------+---------+ | 12 | Tom | 66 | 93 | 67 | | 56 | Paul | 78 | 52 | 75 | | 10 | Marry | 54 | 89 | 74 | | 4 | Tina | 99 | 83 | 48 | | 39 | William | 43 | 96 | 52 | | 74 | Stone | 42 | 40 | 61 | | 86 | Smith | 49 | 85 | 78 | | 37 | Black | 49 | 63 | 47 | | 89 | White | 94 | 31 | 52 | +------+---------+---------+---------+---------+ 这样,我们试图对它进行一个特定查询时,就不得不做一个全表的扫描,速度很慢。例如,我们查找出所有english成绩不及格的学生: mysql>SELECT name,english FROM student WHERE english<60; +---------+---------+ | name | english | +---------+---------+ | Marry | 54 | | William | 43 | | Stone | 42 | | Smith | 49 |

优化-索引

优化-索引.txt为什么我们在讲故事的时候总要加上从前?开了一夏的花,终落得粉身碎骨,却还笑着说意义。人们在使用SQL时往往会陷入一个误区,即太关注于所得的结果是否正确,而忽略了不同的实现方法之间可能存在的性能差异,这种性能差异在大型的或是复杂的数据库环境中(如联机事务处理OLTP或决策支持系统DSS)中表现得尤为明显。 笔者在工作实践中发现,不良的SQL往往来自于不恰当的索引设计、不充份的连接条件和不可优化的where子句。 在对它们进行适当的优化后,其运行速度有了明显地提高! 下面我将从这三个方面分别进行总结: 为了更直观地说明问题,所有实例中的SQL运行时间均经过测试,不超过1秒的均表示为(< 1秒)。---- 测试环境: 主机:HP LH II---- 主频:330MHZ---- 内存:128兆---- 操作系统:Operserver5.0.4---- 数据库:Sybase11.0.3 一、不合理的索引设计---- 例:表record有620000行,试看在不同的索引下,下面几个 SQL的运行情况: ---- 1.在date上建有一非个群集索引 select count(*) from record where date >'19991201' and date < '19991214'and amount >2000 (25秒) select date ,sum(amount) from record group by date(55秒) select count(*) from record where date >'19990901' and place in ('BJ','SH') (27秒) ---- 分析:---- date上有大量的重复值,在非群集索引下,数据在物理上随机存放在数据页上,在范围查找时,必须执行一次表扫描才能找到这一范围内的全部行。 ---- 2.在date上的一个群集索引 select count(*) from record where date >'19991201' and date < '19991214' and amount >2000 (14秒) select date,sum(amount) from record group by date(28秒) select count(*) from record where date >'19990901' and place in ('BJ','SH')(14秒) ---- 分析:---- 在群集索引下,数据在物理上按顺序在数据页上,重复值也排列在一起,因而在范围查找时,可以先找到这个范围的起末点,且只在这个范围内扫描数据页,避免了大范围扫描,提高了查询速度。 ---- 3.在place,date,amount上的组合索引 select count(*) from record where date >'19991201' and date < '19991214' and amount >2000 (26秒) select date,sum(amount) from record group by date(27秒) select count(*) from record where date >'19990901' and place in ('BJ, 'SH')(< 1秒) ---- 分析:---- 这是一个不很合理的组合索引,因为它的前导列是place,第一和第二条SQL没有引用place,因此也没有利用上索引;第三个SQL使用了place,且引用的所有列都包含在组合索引中,形成了索引覆盖,所以它的速度是非常快的。 ---- 4.在date,place,amount上的组合索引

索引的使用原则

索引的优点:这个显而易见,正确的索引会大大提高数据查询,对结果进行排序、分组的操作效率。 索引的缺点:优点显而易见,同样缺点也是显而易见: 1:创建索引需要额外的磁盘空间,索引最大一般为表大小的1.2倍左右。 2:在表数据修改时,例如增加,删除,更新,都需要维护索引表,这是需要系统开销的。 3:不合理的索引设计非但不能利于系统,反而会使系统性能下降。例如我们在一个创建有非聚集索引的列上做范围查询,此列的索引不会起到任何的优化效果,反而由于数据的修改而需要维护索引表,从而影响了对数据修改的性能。 实际例子:还是拿前两篇文章的学生表来讲吧,要查询成绩在50分以上的学生信息select * from student where score>50。学生表包含了100000行记录,而且学分是随机生成的,这样从数据量以及数据分布上都有一定的保障。 第一种情况:学生表有索引。 1:存在聚集索引,但聚集索引不在学分上,这里只分析学分不是聚集索引的情况。 (1):学分上没有索引。此时SQL会通过聚集索引来查找数据,这点估计大家都会知道。 (2):学分上有索引。这种情况,SQL会使用上学分上的索引吗?这个问题估计不是每个人都能回答正确的。既然学分上有索引,而where中又有此列,理应使用了索引,但实际情况并没有使用索引。因为出现了范围查找,如果一个索引一个索引的比较,在性能上比起直接按聚集索引查找全部数据后再过滤来的差。那学分上的索引什么时候 SQL会优先考虑呢?当score指定为一个具体值时,就能使用学分索引查找了。从下图的SQL执行计

划可以得知。 2:不存在聚集索引。 (1):在学分上没有索引,其它字段有索引,这种情况就会出现表扫描。 (2):在学分上有索引,是否会按照学分上的索引进行查找呢?由于上面的表数据量也不少,一般会认为SQL不会采用表扫描,因为会查找全部记录,但实际情况表明SQL 对于范围查询也行采用表扫描而不是按学生索引查询。我们也可以强制SQL按学分查询,于是有下面的SQL执行计划比较,我们可以清楚的看出,强制使用学分做为索引查询比表搜索

数据库规范

数据库相关规范 1.使用utf8mb4字符集 2.所有表、字段必须写清中文注释 3.金额字段禁止使用小数存储(单位:分) 4.禁止使用字段属性隐式转换(如:“WHERE ms_no = 1234”ms_no为字符串类型) 5.尽量不使用负向查询(NOT、!=、<>、!<、!>、NOT IN、NOT LIKE等) 6.禁止使用外键,如有完整性约束,需要应用程序控制 7.禁止使用程序配置文件内的账号访问线上数据库 8.禁止非DBA对线上数据库进行写操作 9.开发、测试、线上环境分离 10.所以提交的SQL语句必须经过测试 11.禁止存储大文件或大照片 12.库名、表名、字段名:小写,下划线分割,不超过32个字符,必须见名知意,禁止拼 音英文混用 13.表必须有主键 14.必须把字段定义为NOT NULL并设置默认值 15.必须使用varchar(20)来存储手机号 16.单表索引控制在5个以内,单索引字段数不许超过5个 a)索引的使用。? b)(1) 尽量避免对索引列进行计算。如计算较多,请提请管理员建立函数索引。? c)(2) 尽量注意比较值与索引列数据类型的一致性。? d)(3) 对于复合索引,SQL语句必须使用主索引列? e)(4) 索引中,尽量避免使用NULL。? f)(5) 对于索引的比较,尽量避免使用NOT=(!=)? g)(6) 查询列和排序列与索引列次序保持一致 (7) 禁止在更新频繁、区分度不高(如:性别)的字段上建立索引 (8) 建立组合索引,必须把区分度高的字段放在前面 17.禁止使用SELECT * ,只获取必要的字段 18.禁止使用INSERT INTO t_xxx VALUES(xxx),必须指定插入的列名 19.禁止在WHERE条件的属性上使用函数或表达式 20.禁止%开头的模糊查询 21.禁止使用OR条件 22.应用程序必须捕获SQL异常,并作出相应处理 23.逻辑删除代替物理删除 24.选择最有效的表名、查询条件顺序(从右到左) 25.减少访问数据库的次数 26.SQL中的关键字均使用大写字母,数据表最好起别名 27.查询条件中“>=”代替“>” 28.等号两边使用空格,逗号后使用空格 29.多表操作必须使用别名 30.整条语句必须写明注释,关键逻辑单独书写注释,说明算法、功能 a)注释风格:注释单独成行、放在语句前面。? b)(1) 应对不易理解的分支条件表达式加注释;? c)(2) 对重要的计算应说明其功能;?

SQL-Serve实验5-索引和视图-

SQL-Serve实验5-索引和视图-

实验5 索引和视图 1.实验目的 (1)掌握使用SQL Server管理平台和Transact-SQL语句CREATE INDEX创建索引的方法。 (2)掌握使用SQL Server管理平台查看索引的方法。(3)掌握使用SQL Server管理平台和Transact-SQL语句DROP INDEX删除索引的方法。 (4)掌握使用SQL Server管理平台和Transact-SQL语句CREATE VIEW创建视图的用法。 (5)了解索引和视图更名的系统存储过程sp_rename的用法。 (6)掌握使用Transact-SQL语句ALTER VIEW修改视图的方法。 (7)了解删除视图的Transact-SQL语句DROP VIEW的用法。 2.实验内容及步骤 (1)分别使用SQL Server管理平台和Transact-SQL语句为studentsdb数据库的student_info表和curriculum表创建主键索引。 使用SQL Server管理平台:

a. b. c. d.

e. 使用Transact-SQL语句: (2)使用SQL Server管理平台按curriculum表的课程编号列创建唯一性索引。

(3)分别使用SQL Server管理平台和Transact-SQL语句为studentsdb数据库的grade表的“分数”字段创建一个非聚集索引,命名为grade_index。 使用SQL Server管理平台: 使用SQL语句: use studentsdb go create index grade_index on grade (分数) (4)为studentsdb数据库的grade表的“学号”和“课程编号”字段创建一个复合唯一索引,命名为grade_id_c_ind。 create index grade_id_c_ind on grade (学号,课程编号)

如何优化数据库,提高查询效率

龙源期刊网 https://www.360docs.net/doc/1212089522.html, 如何优化数据库,提高查询效率 作者:代鸿彬 来源:《学习与科普》2019年第10期 摘要:随着信息时代的到来,生活和工作当中已经无法避免的需要和计算机打交道,和 计算机打交道的同时就必须要用到数据库。数据库系统是计算机当中的一项重要系统,储存在用户的关键信息,不仅对个人影响很大,同时对企事业单位也有着重要影响。 关键词:信息时代;数据库;索引 数据库是信息的载体也是数据的最佳表现形式,它的共享性导致了数据会被大量的搜索查询,为了提高查询的效率,就不得不对数据库进行优化。 一、利用索引进行优化。 索引是数据库的重要组成部分,也是使用者根据需要进行查询最直接的方法,优化索引可以提高查询的效率。当前的数据库当中大部分还是使用国际商业机器公司以前的索引顺序存取方法,对于用户来说肯定会选择方便、快捷的索引方式,怎么方便怎么来。在建立索引的时候针对不同的内容,需要建立不同的连接方式,但是随着用户的增多,查询内容和方向的多元化,这就造成了在实际工作当中经常会有使用频率很少的索引出现,甚至也会出现没有查询所需的索引,这种情况可以通过查询优化器进行自动生成的索引进行查询。对于使用频率较为频繁的列,需要对其进行排序或者分组的列上建立索引时,要优化索引提高效率,对于使用频率很少的列可以不建立索引。 二、简化排序进行优化。 对于部分企事业单位需要排序的内容很多时,就要使用大型数据表来满足查询需求,但是大型数据表涉及的内容很多,为了避免出现重复排序的现象需要对数据表进行简化。在大型数据表当中有一部分的内容可以自动进行排序的次序输出,这时就可以直接利用查询优化器进行优化,将复杂的排序简单化,从而提高索引查询效率。需要排序的列对索引优化影响较大,就像语言当中的ORDER BY 或者GROUP BY句子当中的列次序和索引当中的列次序基本是不同的,但是排序的列可通过表的不同形式表现出来。通过简化排序避免了重复的排序,并且将数据库进行了合理的合并。如果不进行简化排序,就需要将排序的范围进行缩小简化,从而提高查询使用的效率。 三、大型表行数据库存取的合理消除。 数据库系统的存储量是有上限的,所有的索引内容都占有数据库空间,尤其是大型数据表占有的空间更大,将会造成索引时间变长。但是大型表行数据有些内容是不必要的,在进行索引查詢时,数据表当中的存取顺序对查询的效率有直接的影响。例如需要采用存取策略时,通

SQLSERVER索引及优化详解

SqlServer索引及优化详解 (一)深入浅出理解索引结构 实际上,您可以把索引理解为一种特殊的目录。微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引、簇集索引)和非聚集索引(nonclustered index,也称非聚类索引、非簇集索引)。下面,我们举例来说明一下聚集索引和非聚集索引的区别:其实,我们的汉语字典的正文本身就是一个聚集索引。比如,我们要查“安”字,就会很自然地翻开字典的前几页,因为“安”的拼音是“an”,而按照拼音排序汉字的字典是以英文字母“a”开头并以“z”结尾的,那么“安”字就自然地排在字典的前部。如果您翻完了所有以“a”开头的部分仍然找不到这个字,那么就说明您的字典中没有这个字;同样的,如果查“张”字,那您也会将您的字典翻到最后部分,因为“张”的拼音是“zhang”。也就是说,字典的正文部分本身就是一个目录,您不需要再去查其他目录来找到您需要找的内容。 我们把这种正文内容本身就是一种按照一定规则排列的目录称为“聚集索引”。如果您认识某个字,您可以快速地从自动中查到这个字。但您也可能会遇到您不认识的字,不知道它的发音,这时候,您就不能按照刚才的方法找到您要查的字,而需要去根据“偏旁部首”查到您要找的字,然后根据这个字后的页码直接翻到某页来找到您要找的字。但您结合“部首目录”和“检字表”而查到的字的排序并不是真正的正文的排序方法,比如您查“张”字,我们可以看到在查部首之后的检字表中“张”的页码是672页,检字表中“张”的上面是“驰”字,但页码却是63页,“张”的下面是“弩”字,页面是390页。很显然,这些字并不是真正的分别位于“张”字的上下方,现在您看到的连续的“驰、张、弩”三字实际上就是他们在非聚集索引中的排序,是字典正文中的字在非聚集索引中的映射。我们可以通过这种方式来找到您所需要的字,但它需要两个过程,先找到目录中的结果,然后再翻到您所需要的页码。我们把这种目录纯粹是目录,正文纯粹是正文的排序方式称为“非聚集索引”。通过以上例子,我们可以理解到什么是“聚集索引”和“非聚集索引”。进一步引申一下,我们可以很容易的理解:每个表只能有一个聚集索引,因为目录只能按照一种方法进行排序。 (二)何时使用聚集索引或非聚集索引 下面的表总结了何时使用聚集索引或非聚集索引(很重要)。

informix数据库索引使用与维护

informix数据库索引使用与维护.txt都是一个山的狐狸,你跟我讲什么聊斋,站在离你最近的地方,眺望你对别人的微笑,即使心是百般的疼痛只为把你的一举一动尽收眼底.刺眼的白色,让我明白什么是纯粹的伤害。informix数据库索引使用与维护 王增印 对于我们广泛使用的informix数据库系统,它能使我们及时快速准确地管理和使用数据,而要使我们加快数据使用的速度和效率,最重要的一点是要能正确合理地对数据库建立索引。因此为在工作中对数据使用更合理高效,informix数据库索引建立、限制及适用范围及应用维护等问题作一表述。 给表中的字段加索引能帮助我们快捷的使用数据库,但是如果表加的索引不当非但不能加快对数据库的访问,甚至造成informix-sql的错误,中止对库的管理。因而,在建立库表之前需详细了解它的适用范围及限制。 在如下情况下适于建立数据库索引: a、适用于对大型数据库查找并连续输出,如同查找字典越厚越显出索引的重要性。 b、给连接字段加索引,当你库中包含很多表时,往往第一张表中至少有一个连接字段,则给连接字段加索引。(如会计帐务中户主帐与明细帐校验核对时,须连续对户主帐中每一项在明细帐中查找有效值,而户主帐与明细帐中在帐号字段上是连接的,而此时使用索引比不使用大大提高了工效,如果这两个帐表的记录数都达数千时,不建索引将不可能完成这项工作。) c、自动索引,如果你执行的是包含两个表的连接操作且连接字段不加索引的select语句,则rdsql在执行连接操作之前给记录数较多的表自动建立临时索引,检索操作完成后,索引消失,它有利于无索引检索速度的改善。 d、对于经常要查找和排序的字段,它可以在你使用一段时间后,确信要经常查找和排序的字段,你可随时加上。 e、须至少是一个表且其中多于200个记录,虽然informix-spl对于一个表建立索引的数量及表记录多少是不限制的,但建立索引的同时,对于录入和修改数据时,sql都要更新表和索引,同时索引也占用磁盘空间,即对于一个小表建立索引不仅减慢速度还多占空间。 f、要避免给含大量重复值的字段加索引,它会显著减慢删除数据和改变索引字段值的操作。 对数据库建立的索引有如下限制: a、建索引的字段或字组长度不应超过120字节,否则会造成sql错误。 b、被加索引的字段,如果其中有6000个共同项时,也会导致sql错误。

数据库基础试题6(2)(20200521130409)

1.关系数据库中,实现表与表之间的联系是通过(D). A.实体完整性规则 B.用户自定义的完整性规则 C.值域 D.参照完整性规则 2. Visual FoxPro中索引类型包括(A). A.主索引、候选索引、唯一索引、普通索引 B.主索引、候选索引、普通索引、视图索引 C.主索引、次索引、候选索、普通索引 D.主索引、次索引、唯一索引、普通索引 3. 删除数据表文件的命令是(B). TABLE TABLE 4. 假设某字段所要存储的数值介于0~100,且不具备小数,则此字段 采用哪种数据类型最合适(C). A.双精度类型 B.浮动数类型 C.整型类型 D.数值类型

5. 每一个表只能拥有一个(B)索引. A.普通 B.主 C.唯一 D.候选 6.顺序执行下列命令后,屏幕所显示的记录号顺序是(B). USE STUDENT GO 6 LIST NEXT 4 ~10 ~9 ~7 ~4 7. 在数据库设计器中,建立两个表之间的一对多联系是通过以下索引实现的(D). A.一方表的普通索引,"多方"表的候选索引或普通索引 B.一方表的主索引,"多方"表的普通索引或候选索引 C.一方表的普通索引,"多方"表的主索引或候选索引 D."一方"表的主索引或候选索引,"多方"表的普通索引 8. 当前工作区是指(C). A.最后执行REPLACE命令所在的工作区 B.建立数据表时所在的工作区 C.最后执行SELECT命令所选择的工作区 D.最后执行USE命令所在的工作区

9. 已知当前表中有60条记录,当前记录为第6号记录.如果执行命令 SKIP 3后,则当前为第(D)号记录. 10. 执行SELECT 0 选择工作区的结果是(A). A.选择了空闲的最小号工作区 B.选择了0号工作区 C.显示出错信息 D.选择了一个空闲的工作区 11. 唯一索引中的"唯一性"是指(B)的唯一. A.字段值 B.索引项 C.视图项 D.字符值 12. 在Visual Foxpro中,求余运算和(C)函数作用相同. () () () ()

实验5 索引和视图

数据库技术与应用 实验报告 实验名称:实验五:索引和视图 系(科):信息系电子信息工程 班级: 180932 学号: 18093207 姓名:陶赛年 完成时间: 2012-4-28 南京师范大学中北学院

一、实验目的 1.学会使用SQL Server管理平台和Transact-SQL语句CREATE INDEX创建索引。 2.学会使用SQL Server管理平台查看索引。 3.学会使用SQL Server管理平台和Transact-SQL语句DROP INDEX删除索引。 4.掌握使用SQL Server管理平台、向导等创建、管理和删除全文索引,并使用全文索引查询信息的方法。 5. 掌握使用SQL Server管理平台和Transact-SQL语句CREATE VIEW创建视图的用法。 6.掌握系统存储过程sp_rename的用法。 7.掌握使用Transact-SQL语句ALTER VIEW修改视图的方法。 二、实验准备 1.了解聚集索引和非聚集索引的概念。 2.了解使用Transact-SQL语句CREATE INDEX创建索引的语法。 3.了解使用SQL Server管理平台创建索引的步骤。 4.了解Transact-SQL语句DROP INDEX删除索引的用法。 5.了解创建视图的Transact-SQL语句CREATE VIEW的语法格式及用法。 6.了解修改视图的Transact-SQL语句ALTER VIEW的语法格式。 7.了解视图更名的系统存储过程sp_rename的用法。 8.了解删除视图的Transact-SQL语句DROP VIEW的用法。 三、实验内容 1.分别使用SQL Server管理平台和Transact-SQL语句为studentsdb数据库的《学生表》和《课程表》创建主键索引。 (1) 使用SQL Server管理平台为studentsdb数据库的《学生表》和《课程表》创建主键索引。

MYSQL索引和优化详细说明教程

MYSQL索引和优化详细说明教程 2008-05-16 15:59 MYSQL索引和优化 一、什么是索引? 索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存。如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录。表里面的记录数量越多,这个操作的代价就越高。如果作为搜索条件的列上已经创建了索引,MySQL无需扫描任何记录即可迅速得到目标记录所在的位置。如果表有1000个记录,通过索引查找记录至少要比顺序扫描记录快100倍。 假设我们创建了一个名为people的表: 然后,我们完全随机把1000个不同name值插入到people表。 可以看到,在数据文件中name列没有任何明确的次序。如果我们创建了name 列的索引,MySQL将在索引中排序name列: 对于索引中的每一项,MySQL在内部为它保存一个数据文件中实际记录所在位置的“指针”。因此,如果我们要查找name等于“Mike”记录的peopleid(SQL 命令为“SELECT peopleid FROM people WHERE name=\’Mike\’;”),MySQL 能够在name的索引中查找“Mike”值,然后直接转到数据文件中相应的行,准确地返回该行的peopleid(999)。在这个过程中,MySQL只需处理一个行就可以返回结果。如果没有“name”列的索引,MySQL要扫描数据文件中的所有记录,即1000个记录!显然,需要MySQL处理的记录数量越少,则它完成任务的速度就越快。 二、索引的类型 MySQL提供多种索引类型供选择: 普通索引 这是最基本的索引类型,而且它没有唯一性之类的限制。普通索引可以通 过以下几种方式创建:

sql优化方案讲解

Sql优化方案 一.数据库优化技术 1.索引(强烈建议使用) 1.1优点 创建索引可以大大提高系统的性能。 第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。 第二,可以大大加快数据的检索速度,这也是创建索引的最主要的原因。 第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。 第四,在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。 第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。 1.2 缺点 第一,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。 第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。 1.3 使用准则 索引是建立在数据库表中的某些列的上面。因此,在创建索引的时候,应该仔细考虑在哪些列上可以创建索引,在哪些列上不能创建索引。 一般来说,应该在这些列上创建索引。 第一,在经常需要搜索的列上,可以加快搜索的速度;

第二,在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构; 第三,在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度;第四,在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的; 第五,在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间; 第六,在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。 同样,对于有些列不应该创建索引。一般来说,不应该创建索引的的这些列具有下列特点: 第一,对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。 第二,对于那些只有很少数据值的列也不应该增加索引。这是因为,由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。 第三,对于那些定义为text, image和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。 第四,当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改性能远远大于检索性能时,不应该创建索引。 1.4 总结 1)索引提高了数据库的检索性能,但一定程度上牺牲了修改性能。因此适用于“多查询少修改”(insert,update,delete)的表。 2)对此类表中的外键,需要分组,排序或作为检索条件的字段建立索引 3)对此类表中查询使用少,字段取值少,字段数据量大的不应创建索引

索引的优点和缺点

一、为什么要创建索引呢(优点)? 这是因为,创建索引可以大大提高系统的性能。 第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。 第二,可以大大加快数据的检索速度,这也是创建索引的最主要的原因。 第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。 第四,在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。 二、建立方向索引的不利因素(缺点) 也许会有人要问:增加索引有如此多的优点,为什么不对表中的每一个列创建一个索引呢?这种想法固然有其合理性,然而也有其片面性。虽然,索引有许多优点,但是,为表中的每一个列都增加索引,是非常不明智的。这是因为,增加索引也有许多不利的一个方面。 第一,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。 第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。 第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。 三、创建方向索引的准则 索引是建立在数据库表中的某些列的上面。因此,在创建索引的时候,应该仔细考虑在哪些列上可以创建索引,在哪些列上不能创建索引。 一般来说,应该在这些列上创建索引。 第一,在经常需要搜索的列上,可以加快搜索的速度; 第二,在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构; 第三,在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度; 第四,在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的; 第五,在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间; 第六,在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。 同样,对于有些列不应该创建索引。一般来说,不应该创建索引的的这些列具有下列特点: 第一,对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。 第二,对于那些只有很少数据值的列也不应该增加索引。这是因为,由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。 第三,对于那些定义为text, image和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。 第四,当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改性能远远大于检索性能时,不应该创建索引。

实验四 索引和视图参考答案

索引 --为表student中SName属性建立惟一索引 create unique index snameindex on student(SName) --为teacher中的tname属性建立惟一聚集索引。 由于sqlserver2005在主键和具有unique约束的属性上自动建立了索引,且在主键上自动建立了聚集索引,因此必须移除主键(或其它聚集索引),然后才能在tname上建立聚集索引create unique clustered index tnameindex on teacher(tname) 移除主键

然后还原Tno为teacher表的主键 --利用系统存储过程sp_helpindex查看表student上的所有索引。

exec sp_helpindex student --利用系统存储过程sp_rename将表student上的索引改名。 exec sp_helpindex student exec sp_rename 'student.snameindex','snameindex2' --删除表student中的惟一索引。(注意,sqlserver2005在主键和具有unique约束的属性上自动建立了索引,要删除这些索引,必须先取消这些属性的主键或unique性质(通过修改表),才能删除索引,不能直接删除索引) drop index student.snameindex2 --视图 --建立视图teacherview1(无check option选项),只显示教师表中姓张的教师的教师编号、教师姓名、所在系。 create view teacherview1 as select Tno, TName, DepID from teacher where TName like '张%' --建立视图teacherview2(带check option选项),只显示教师表中姓张的教师的教师编号、教师姓名、所在系。 create view teacherview2 as select Tno, TName, DepID from teacher where TName like '张%' with check option --建立视图teacherview3(带encryption选项),只显示教师表中姓张的教师的教师编号、教师姓名、所在系。 create view teacherview3 with encryption as select Tno, TName, DepID from teacher where TName like '张%' --分别向teacherview2、teacherview1中插入记录(’866’,’杨志’,3),体会with check option选项的作用。 insert into teacherview1 values('866','杨志',3) insert into teacherview2 values('867','王五',3)

SQL索引详解(优化数据库)

SQL索引一步到位 SQL索引在数据库优化中占有一个非常大的比例,一个好的索引的设计,可以让你的效率提高几十甚至几百倍,在这里将带你一步步揭开他的神秘面纱。 1.1 什么是索引? SQL索引有两种,聚集索引和非聚集索引,索引主要目的是提高了SQL Server系统的性能,加快数据的查询速度与减少系统的响应时间 下面举两个简单的例子: 图书馆的例子:一个图书馆那么多书,怎么管理呢?建立一个字母开头的目录,例如:a开头的书,在第一排,b开头的在第二排,这样在找什么书就好说了,这个就是一个聚集索引,可是很多人借书找某某作者的,不知道书名怎么办?图书管理员在写一个目录,某某作者的书分别在第几排,第几排,这就是一个非聚集索引 字典的例子:字典前面的目录,可以按照拼音和部首去查询,我们想查询一个字,只需要根据拼音或者部首去查询,就可以快速的定位到这个汉字了,这个就是索引的好处,拼音查询法就是聚集索引,部首查询就是一个非聚集索引. 看了上面的例子,下面的一句话大家就很容易理解了:聚集索引存储记录是物理上连续存在,而非聚集索引是逻辑上的连续,物理存储并不连续。就像字段,聚集索引是连续的,a后面肯定是b,非聚集索引就不连续了,就像图书馆的某个作者的书,有可能在第1个货架上和第10个货架上。还有一个小知识点就是:聚集索引一个表只能有一个,而非聚集索引一个表可以存在多个。 1.2 索引的存储机制 首先,无索引的表,查询时,是按照顺序存续的方法扫描每个记录来查找符合条件的记录,这样效率十分低下,举个例子,如果我们将字典的汉字随即打乱,没有前面的按照拼 音或者部首查询,那么我们想找一个字,按照顺序的方式去一页页的找,这样效率有多底,大家可以想象。 聚集索引和非聚集索引的根本区别是表记录的排列顺序和与索引的排列顺序是否一致,其实理解起来非常简单,还是举字典的例子:如果按照拼音查询,那么都是从a-z的,是 具有连续性的,a后面就是b,b后面就是c,聚集索引就是这样的,他是和表的物理排列顺序是一样的,例如有id为聚集索引,那么1后面肯定是2,2后面肯定是3,所以说这样的搜索顺序的就是聚集索引。非聚集索引就和按照部首查询是一样是,可能按照偏房查询的时候,根据偏旁‘弓’字旁,索引出两个汉字,张和弘,但是这两个其实一个在100页,一个在1000页,(这里只是举个例子),他们的索引顺序和数据库表的排列顺序是不一样的,这个样的就是非聚集索引。 原理明白了,那他们是怎么存储的呢?在这里简单的说一下,聚集索引就是在数据库 被开辟一个物理空间存放他的排列的值,例如1-100,所以当插入数据时,他会重新排列 整个整个物理空间,而非聚集索引其实可以看作是一个含有聚集索引的表,他只仅包含原表中非聚集索引的列和指向实际物理表的指针。他只记录一个指针,其实就有点和堆栈差不多的感觉了

实验三 索引和视图

实验三索引和视图 一、实验目的 1.掌握利用SSMS和T—SQL语句创建和删除索引的两种方法。 2.掌握利用SSMS和T—SQL语句创建、查询、更新及删除视图的方法。 ssex char(3)constraint ssex_ch check (ssex in('男','女')), sage int not null constraint sage_ch check (sage between 15 and 30), sdept char(10))

values('C02','数据结构','C05',2) insert into course values('C03','数据库','C02',2) insert into course

values('C04','DB_设计','C03',3) insert into course values('C05','C++',null,3) insert into course values('C06','网络原理','C07',3) create table sc(sno char(5)not null, cno char(5)not null, grade int constraint grade_ch check(grade between 0 and 100), primary key(sno,cno),

constraint fk_sno foreign key (sno)references student(sno), constraint fk_cno foreign key (cno)references course(cno)) insert into sc values('S01','C01',92) insert into sc values('S01','C03',84) insert into sc values('S02','C01',90) insert into sc values('S02','C02',94) insert into sc values('S02','C03',82) insert into sc values('S03','C01',72) insert into sc values('S03','C02',90) insert into sc values('S04','C03',75) 2.索引的建立、删除 ①用SSMS的方式为Student表按Sno(学号)升序建唯一索引

浅谈MySQL索引分析和优化

MySQL索引分析和优化列:

由于索引文件以B-树格式保存,MySQL能够立即转到合适的firstname,然后再转到合适的lastname,最后转到合适的age。在没有扫描数据文件任何一个记录的情况下,MySQL就正确地找出了搜索的目标记录! 那么,如果在firstname、lastname、age这三个列上分别创建单列索引,效果是否和创建一个firstname、lastname、age的多列索引一样呢?答案是否定的,两者完全不同。当我们执行查询的时候,MySQL只能使用一个索引。如果你有三个单列的索引,MySQL会试图选择一个限制最严格的索引。但是,即使是限制最严格的单列索引,它的限制能力也肯定远远低于firstname、lastname、age这三个列上的多列索引。

下面我们就来看看这个EXPLAIN分析结果的含义。 table:这是表的名字。 type:连接操作的类型。下面是MySQL文档关于ref连接类型的说明: “对于每一种与另一个表中记录的组合,MySQL将从当前的表读取所有带有匹配索引值的记录。如果连接操作只使用键的最左前缀,或者如果键不是UNIQUE或PRIMARY KEY类型(换句话说,如果连接操作不能根据键值选择出唯一行),则MySQL使用ref连接类型。如果连接操作所用的键只匹配少量的记录,则ref是一种好的连接类型。” 在本例中,由于索引不是UNIQUE类型,ref是我们能够得到的最好连接类型。 如果EXPLAIN显示连接类型是“ALL”,而且你并不想从表里面选择出大多数记录,那么MySQL的操作效率将非常低,因为它要扫描整个表。你可以加入更多的索引来解决这个问题。预知更多信息,请参见MySQL的手册说明。 possible_keys: 可能可以利用的索引的名字。这里的索引名字是创建索引时指定的索引昵称;如果索引没有昵称,则默认显示的是索引中第一个列的名字(在本例中,它是“firstname”)。默认索引名字的含义往往不是很明显。 Key:它显示了MySQL实际使用的索引的名字。如果它为空(或NULL),则MySQL不使用索引。 key_len:索引中被使用部分的长度,以字节计。在本例中,key_len是102,其中firstname 占50字节,lastname占50字节,age占2字节。如果MySQL只使用索引中的firstname部分,则key_len将是50。 ref:它显示的是列的名字(或单词“const”),MySQL将根据这些列来选择行。在本例中,MySQL根据三个常量选择行。 rows:MySQL所认为的它在找到正确的结果之前必须扫描的记录数。显然,这里最理想的数字就是1。 Extra:这里可能出现许多不同的选项,其中大多数将对查询产生负面影响。在本例中,MySQL 只是提醒我们它将用WHERE子句限制搜索结果集。 索引的缺点 到目前为止,我们讨论的都是索引的优点。事实上,索引也是有缺点的。 首先,索引要占用磁盘空间。通常情况下,这个问题不是很突出。但是,如果你创建每一种可能列组合的索引,索引文件体积的增长速度将远远超过数据文件。如果你有一个很大的表,索引文件的大小可能达到操作系统允许的最大文件限制。 第二,对于需要写入数据的操作,比如DELETE、UPDATE以及INSERT操作,索引会降低它们的速度。这是因为MySQL不仅要把改动数据写入数据文件,而且它还要把这些改动写入索引文件。 【结束语】在大型数据库中,索引是提高速度的一个关键因素。不管表的结构是多么简单,一次500000行的表扫描操作无论如何不会快。如果你的网站上也有这种大规模的表,那么你确实应该花些时间去分析可以采用哪些索引,并考虑是否可以改写查询以优化应用。要了解更多信息,请参见MySQL manual。另外注意,本文假定你所使用的MySQL是3.23版,部分查询不能在3.22版MySQL上执行。

相关文档
最新文档