版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
《数据库原理及应用》✩精品课件合集目录01
索引概述02B+树索引结构03全文索引04索引的实现过程05索引的操作(建立、查看与删除)06
视图及其工作机制07视图的建立、查看与删除08
视图的更新第7章索引与视图索引概述数据库索引是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中的数据。
在大多数据库系统中,数据库读取(查询)数据的次数远大于写入数据的次数,因此,如何优化数据读取的效率是数据库系统的主要工作之一。
索引是一种以空间代价换取时间效率提升的方法。B+树索引B+树索引是关系数据库系统中最常用的一种索引结构。B+树中的B代表平衡(Balance),因为B+树是从平衡二叉树演化而来的。数据库中的B+树索引可以分为:聚集索引也称聚簇索引:将数据存储与索引放到一起,索引结构的叶子节点保存所有数据。在聚集索引中,表中行的逻辑顺序与主键值的索引顺序相同,因此,一个表只有一个聚集索引。非聚集索引也称二级索引或辅助索引,除聚集索引外其他索引都称为二级索引。聚集索引(ClusteredIndex)非聚集索引(Non-ClusteredIndex)
16K聚集索引生成创建表时,系统为表分配一个16K大小的根页插入表中的记录最初存储在根页中,页内记录按主键从小到大存放,并建立单链表。当根页中空间不足时,系统会再分配两个空的数据页,将根页中的数据拷贝到数据页中,根页变为目录页,目录页中存放主键值和页指针,并建立页间指针。在聚集索引中查询数据例1:查询学号为‘001111’的学生。例2:查询学号大于‘001111’且小于‘001206’的所有学生。SELECT*FROMstudentWHEREsno='001111';SELECT*FROMstudentWHEREsno>'001111'ANDsno<'001206';先后调入内存的页:根页1→目录页2→数据页7先后调入内存的页:根页1→目录页2→数据页7
→数据页8→数据页9在聚集索引中查询数据若1个目录页中可存放8行,则B+树变为左图;例1:查询学号为‘001111’的学生。例2:查询学号大于‘001111’且小于‘001206’的所有学生。先后调入内存的页:根页1→数据页7先后调入内存的页:根页1→数据页7
→数据页8→数据页9结论:树的高度直接影响查询效率问题:如何才能降低树的高度呢?答:尽量降低主键的存储空间思考:存储字符串‘123456789’和存储整数123456789,哪个空间大?创建聚集索引创建方式一:在建表时定义主键ALTERTABLEstuADDPRIMARYKEY(sno);问题:如果不定义主键能否创建聚集索引?如果不定义主键,系统将使用第一个唯一(UNIQUE)索引创建聚集索引。如果表没有主键,且没有唯一索引,则系统会自动生成一个rowid作为隐藏的聚集索引主键。创建方式二:修改表时创建,如表是从外部导入的则没有主键。使用聚集索引EXPLAINSELECT*FROMstudentWHEREsno='001111';使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析你的查询语句EXPLAINSELECT*FROMstudentWHEREsname='王林';EXPLAINSELECT*FROMstudentWHEREsno>'001111'ANDsno<'001206';EXPLAINSELECT*FROMstudentWHEREtotalcredit>45;创建二级索引二级索引是在非主键字段上创建的索引;生成的B+树索引特点如下:数据页中按拼音顺序存储索引键值,并存储相应的主键值;目录页中存储索引键值和页指针;每张表有多个字段,可创建多个二级索引。(1)CREATETABLEtudent(
……
INDEXidx_sname(sname)
)CHARSET=gbk;(2)CREATEINDEXidx_snameONstudent(sname);使用二级索引查询SELECTsnoFROMstudentWHEREsname='王林';先后调入内存的页:目录页1→目录页2→数据页7→数据页6查询任务在二级索引中就能完成;思考:SELECT*FROMstudentWHEREsname='王林';这个查询在二级索引中能否完成?回表查询思考:为什么在写SELECT语句时,SELECT后面尽量写字段名而不用“*”。联合索引联合索引也称多列索引,是建立在多个字段上的索引;联合索引中的数据根据最左侧的字段进行排序,一般把查询中最频繁使用的字段放在索引最左侧;利用联合索引进行查询要遵循最左前缀原则;有时查询的字段不是最左侧的,系统也使用索引来查询;为什么?若查询的字段都在联合索引中,此时称为索引覆盖。联合索引的创建与使用联合索引也是二级索引,一般创建方式如下:CREATEINDEXidx_sname_birthdayONstudent(sname,birthday);例:若student表中已在sno上创建了聚集primary;在sname创建了二级索引idx_sname;在sname+birthday创建了联合索引idx_sname_birthday;分析以下查询语句对索引的使用情况。(1)SELECTsnoFROMstudentWHEREsname='王林'ANDbirthday='2005-01-01';(2)SELECT*FROMstudentWHEREsname='王林'ANDbirthday='2005-01-01';(3)SELECTsno,sname,birthdayFROMstudentWHEREbirthday='2005-01-01';(4)SELECTsno,sname,birthday,deptFROMstudentWHEREbirthday='2005-01-01';二级索引idx_sname_birthday二级索引idx_sname_birthday和聚集索引primary二级索引idx_sname_birthday全表扫描全文索引创建与使用问题:查找是“三好生”的学生全文索引:能够将存储于数据库中的文本中的任意内容查找出来的技术。创建全文索引:CREATEFULLTEXTINDEXft_remarksONstudent(remarks);使用全文索引:SELECT*FROMstudentWHEREMATCH(remarks)AGAINST('三好生');索引的设计原则为使索引的使用效率更高,在创建索引时,通常遵循以下设计原则:(1)索引命名符合规范;主键索引名为pk_字段名;唯一索引名为uk_字段名;普通索引名为idx_字段名。(2)条件子句中频繁使用的字段、数字型的字段、存储空间较小的字段适合建立索引;选择在WHERE子句、GROUPBY子句、ORDERBY子句或表与表之间连接运算等频繁使用的字段上建立索引(3)重复值较高的字段、更新频繁的字段不适合建立索引;(4)索引字段的值很长,最好使用字段值的前缀建立索引;
CREATEINDEXidx_cameONcourse(cname(6));(5)限制索引的数量,否则会降低系统效率;思考:前缀索引取多少字符来创建建索引CREATEINDEXpf_cnameONcourse(cname(4));【例7.3】在course表的cname字段上创建前缀索引pf_cnameSELECTCOUNT(DISTINCTLEFT(cname,3))/COUNT(cname)FROMcourselength值取3时,执行结果为0.7778,SELECTCOUNT(DISTINCTLEFT(cname,4))/COUNT(cname)FROMcourselength值取4时,执行结果为1.0000。算法:索引的设计原则索引的使用原则(1)查询时应保证索引字段独立例:student表已按主键sno字段建立了索引,查询语句“EXPLAINSELECT*FROMstudentWHEREsno+'2'>'001106';”会不会使用索引?转换:EXPLAINSELECT*FROMstudentWHEREsno>'001106',执行计划结果如下:(2)模糊查询中通配符不要放在最左边使用
模糊查询时,若匹配模式中的最左侧含有通配符(%),会导致MySQL执行全表扫描,而不会使用设置的索引。例:student表中已按sname字段建立索引sname_index,执行“SELECT*FROMstudentWHEREsnameLIKE'王%';”语句会使用索引,执行计划如下图。执行“SELECT*FROMstudentWHEREsnameLIKE'%王%';”语句则会放弃使用索引,采用全表扫描的方式查询,执行计划如下图。索引的使用原则索引的使用原则(3)最左前缀匹配原则:对于联合索引,系统按从左到右的顺序使用索引中的字段,一个查询可以只使用索引中的一部分,但只能是最左侧部分。例如索引是index(a,b,c)可以支持a、a,b、a,b,c三种组合进行查找,但不支持b,c或c进行查找。例:按sname字段、sex字段和birthday字段建立的联合索引名为idx_sname_sex_birthday,考虑以下查询语句对索引的使用:SELECT*FROMstudentWHEREsname='王林'ANDsex='男'
;SELECT*FROMstudentWHEREbirthday='2000-01-01'ANDsname='王林';SELECT*FROMstudentWHEREsex='男'ANDbirthday>'2000-01-01';
(4)查询时使用索引覆盖。
当SELECT查询语句涉及的字段包含在复合索引文件中,WHERE语句不需要满足最左前缀匹配,系统也会按索引执行。称此为索引覆盖。索引的使用原则-索引覆盖例:若已建立了sname+sex+birthday的复合索引,执行下面的查询:SELECTsnameFROMstudentWHEREbirthday=‘2000-01-01’;该查询会不会使用索引?此查询虽不符合最左前缀匹配原则,但因索引文件中包含了sname和birthday两个字段,因此无需回表,即可完成查询。二级索引中的存储的信息比聚集索引少,因此,B+树的高度较小,查询速度可能较快。MySQL中查询的基本流程MySQL支持多种引擎,InnoDB的主键索引采用聚集索引,辅助索引采用非聚集索引。查询的基本流程如下图。根据索引生成执行计划MySQL中创建索引的类别(1)PRIMARY:主键索引,索引列值唯一且不能为空;(2)INDEX:普通索引,索引列没有任何限制。(3)UNIQUE:唯一索引,索引列的值必须是唯一的,但允许有空值。(4)FULLTEXT:全文索引。(5)SPATIAL:空间索引,对空间数据类型的字段建立的索引(自学)。(6)哈希索引(也称HASH索引):对于每一条行数据,存储引擎对所有的索引列计算一个哈希码。将所有的哈希码存储在索引中,同时在哈希表中保存指向每一个数据行的指针。系统自建。创建索引1.建表时创建索引CREATETABLE表名(字段列表,[UNIQUE|FULLTEXT|SPATIAL]INDEX|KEY<index_name>
(<column_name>[(length)][ASC|DESC],……));CREATETABLEstudent(……INDEXidx_sname_dept(sname,dept),FULLTEXTft_remarks(remarks));【例7.1】(1)在sname字段和dept字段上创建联合索引idx_sname_dept;(2)在remarks字段上创建全文索引ft_remarks。创建索引2.建表后创建索引CREATE[UNIQUE|FULLTEXT|SPATIAL]INDEX<index_name>ON<table_name>(<column_name>[(length)][ASC|DESC]……);CREATEUNIQUEINDEXuk_cnameONcourse(cname);【例7.2】在course表的cname字段上创建唯一索引uk_cnameCREATEINDEXpf_cnameONcourse(cname(4));【例7.3】在course表的cname字段上创建前缀索引pf_cname思考:CREATEINDEX命令能创建主索引吗?创建索引3.修改表结构添加索引ALTERTABLE<table_name>ADD[UNIQUE|FULLTEXT|SPATIAL]INDEX<index_name>(<column_name>[(length)][ASC|DESC]……);ALTERTABLEscoreADDUNIQUEINDEXidx_sno_cno(sno,cno);【例7.3】在score表的sno字段和cno字段创建组合唯一索引,约束同一个学生的同一门课成绩只能出现一次。可以通过SHOWINDEX语句来查看索引。语法格式为:SHOWINDEXFROM<table_name>[where<condition>];查看索引【例7.4】查看course表中的索引。SHOWINDEXFROMcourse;索引文件建立后,SQL语句在执行过程中如何使用索引由数据库系统决定,但可以使用EXPLAIN关键字查看SQL语句执行中索引的使用情况。查看索引使用【例7.5】查看student表中的索引使用。EXPLAINSELECT*FROMstudentWHEREsnameLIKE'王%';可以通过ALTERTABLE语句和DROPINDEX语句两种方式删除索引。删除索引【例7.7】删除student表中的idx_sname_dept索引。ALTERTABLEstudent1DROPINDEXidx_sname_dept;ALTERTABLE<table_name>DROPINDEX<index_name>;
DROPINDEX<index_name>ON<table_name>;【例7.8】删除score表中的uk_sno_cno索引。DROPINDEXuk_sno_cnoONscore;索引总结优点:使用索引,可以在查询的过程中,提高系统的性能。缺点:占用更多的存储空间;索引的维护成本很高,每次新增、删除数据都需要整理B+树结构(结点分裂、合并)拖慢了增删改的速度。
索引必须根据表中的列数据的使用特性进行创建,而不能随意建立,在什么情况下使用索引、使用什么类型的索引以及在什么情况下不使用索引,需要根据数据库的设计需求或使用经验来判断。视图概述视图可以看成是一个窗口,它所反映的是一个表或若干表的局部数据。视图一经定义,用户就可以把它当作表一样来查询数据。视图和基本表不同,视图是一个虚表,即视图储存的是查询语句而不是查询结果。视图是定义在基本表上的,也可以定义在视图上;一个视图可在几个表或视图上建立,一个表或视图也可建立多个视图。视图2视图1基本表1基本表2基本表3视图定义CREATE
[ORREPLACE]VIEW<视图名>
AS<子查询>[WITHCHECKOPTION]执行CREATEVIEW语句时只是把视图定义存入数据字典,并不执行其中的SELECT语句。WITHCHECKOPTION表示对视图进行UPDATE,INSERT和DELETE操作时要保证更新、插入和删除的行满足视图定义中的谓词条件。如果子查询中包含有计算列,须指定列名(别名)。视图定义【例7.9】建立视图view_dept,包含专业信息。CREATEVIEWview_deptASSELECTdistinctdeptFROMstudent;【例7.10】建立计算机系学生的视图view_cs。CREATEVIEWview_deptASSELECT*FROMstudentWHEREdept='计算机';注意:INSERTINTOview_cs1(sno,sname,dept)VALUES(‘111111’,‘abc’,‘通信工程’);这条语句能否执行?视图定义【例7.11】建立通信工程系学生的视图view_ce,并要求进行修改和插入操作时仍需保证该视图只有通信工程系的学生。CREATEVIEWview_ceASSELECT*FROMstudentWHEREdept='通信工程'WITHCHECKOPTION;注意:INSERTINTOview_ce(sno,sname,dept)VALUES('111110','abc','计算机');这条语句能否执行?视图定义【例7.12】建立反映学生年龄的视图view_age,包含sno、sname、age。CREATEVIEWview_age(sno,sname,age)ASSELECTsno,sname,YEAR(CURDATE())-YEAR(birthday)FROMstudent;注意:INSERTINTOview_ageVALUES('111101','abc',20);这条语句能否执行?视图定义【例7.13】建立反映学生平均成绩的视图view_avgscore,包含sno、avg_score。CREATEVIEWview_avgscore(sno,avg_score)ASSELECTsno,AVG(grade)FROMscoreGROUPBYsno;注意:UPDATEview_avgscoreSETavg_score=avg_score+10WHEREsno='001101';这条语句能否执行?视图定义【例7.14】建立计算机系选修了102号课程的学生的视图view_cs_102,视图中包括sno、sname、grade。CREATEVIEWview_cs_102ASSELECTstudent.sno,sname,gradeFROMstudent,scoreWHEREstudent.sno=score.snoANDdept='计算机'ANDcno='102';视图定义【例7.15】建立计算机系选修了102号课程且成绩在90分以上(含90)的学生的视图view_cs_102_90,视图中包含学号、姓名、成绩。CREATEVIEWview_cs_102_90ASSELECTsno,sname,gradeFROMview_cs_102WHEREgrade>=90;也可以通过视图完成查询:SELECT*FROMview_cs_102WHEREgrade>80;视图查看【例7.16】查看视图view_cs的字段信息DESCRIBEview_cs;【例7.17】查看视图view_ce的创建语句。SHOWCREATEVIEWview_ce;【例7.18】查看information_schema数据库下的views表。SELECT*FROMinformation_schema.views;视图修改CREATEORREPLACEVIEWALTERVIEW<视图名>AS<子查询>(1)使用CREATEORREPLACE语句修改视图【例7.19】修改视图view_cs,删除备注字段remarks。CREATEORREPLACEVIEWview_csASSELECTsno,sname,dept,birthday,totalcreditFROMstudentWHEREdept='计算机';视图修改(2)使用ALTER语句修改视图ALTERVIEW<视图名>AS<子查询>【例7.20】修改视图view_cs,增加字段sex。ALTERVIEWview_csASSELECTsno,sname,dept,sex,birthday,totalcreditFROMstudentWHEREdept='计算机';更新视图数据当对视图中的数据进行增加、删除和修改操作时,基本表中的数据会相应地发生变化,反之亦然。
要使视图可更新,视图中的行和列与底层基本表之间必须存在一对一的关系,行列子集视图是可更新的。在定义视图的SELECT语句后的字段列表中使用DISTINCT、聚合函数、子查询中有GROUPBY、HAVING、UNION短语等,视图不支持数据更新;注意:视图一般用来简化查询工作,尽量不用视图做数据更新操作.【例7.24】使用DELETE语句将通信工程系学生视图view_ce中sno为001203的学生删除。DELETEFROMview_ceWHEREsno='001203';更新视图数据DELETEFROMstudentWHEREsno='001203'ANDdept='通信工程';删除视图【例7.25】删除视图view_cs_102。DROPVIEWview_cs_102;删除视图的格式:
DROPVIEW<view_name>;视图的优点简单地讲,视图具有以下优点:操作简单减少数据冗余数据安全适应灵活多变的需求能够分解复杂的查询逻辑数据库的三级模式结构数据库应用B
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度劳动合同:某互联网公司与员工的就业协议
- 电影胶片显影机市场发展预测和趋势分析
- 2024年度智能家居系统研发与合作合同
- 2024年度带电器家具的个人租房合同:租金减免及优惠政策
- 2024年度版权出租合同标的及出租期限和租金
- 2024年度物联网技术在智慧物流中的应用合同
- 2024年度LED路灯驱动电源技术开发与合作合同
- 2024年度录像资料存储与处理安全合同
- 2024全新彩绘合同协议书下载
- 家庭日用纺织品市场发展现状调查及供需格局分析预测报告
- 2023年营养师、营养指导员专业技能及理论知识考试题库(附含答案)
- 肺功能万里行考试内容
- 男生青春期教育讲座-课件
- 《银行运营档案管理系统业务管理规定》制定说明
- 教育人力资源管理:绩效管理(二)教学课件
- 阳光少年实践活动心得感悟3篇
- 经典校园英语舞台剧剧本:皇帝的新装
- pep人教版英语六年级上册Unit2《Waystogotoschool》大单元作业设计(三)
- 全员育人导师制学生谈话记录
- 初中物理人教九年级(2023年更新)第十七章 欧姆定律九年级物理电阻的测量教学设计
- 言语的第三思维结合语境
评论
0/150
提交评论