【数据库】索引

本文详细介绍了数据库索引的概念,包括创建索引的好处和坏处,以及应该和不应该创建索引的列情况。讨论了索引的分类,如聚集索引和非聚集索引,以及主键和唯一索引的区别。同时,文中还阐述了索引失效的常见情况,并给出了索引优化的策略,如避免左模糊查询、合理使用联合索引等。
摘要由CSDN通过智能技术生成

(一)索引

   1.1 概念

      索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。在没有索引的情况下,数据库会遍历全部数据后选择符合条件的;而有了相应的索引之后,数据库会直接在索引中查找符合条件的选项。

   1.2 创建索引的好处

     (1)通过创建索引,可以在查询的过程中,提高系统的性能

     (2)通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性

     (3)在使用分组和排序子句进行数据检索时,可以减少查询中分组和排序的时间

   1.3 创建索引的坏处

     (1)创建索引和维护索引要耗费时间,而且时间随着数据量的增加而增大

     (2)索引需要占用物理空间,如果要建立聚簇索引,所需要的空间会更大

     (3)在对表中的数据进行增加删除和修改时需要耗费较多的时间,因为索引也要动态地维护

   1.4应该被创建索引的列

     (1)经常需要搜索的列上

     (2)作为主键的列上

     (3)经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度

     (4)经常需要根据范围进行搜索的列上

     (5)经常需要排序的列上

     (6)经常使用在where子句上面的列上

   1.5 不应该被创建索引的列

     (1)查询中很少用到的列

     (2)对于那些具有很少数据值的列.比如人事表的性别列,bit数据类型的列

     (3)对于那些定义为text,image的列.因为这些列的数据量相当大

     (4)当对修改性能的要求远远大于搜索性能时.因为当增加索引时,会提高搜索性能,但是会降低修改性能

(二)索引的分类

   2.1 按照物理存储角度分类

         2.1.1 聚集索引

         该索引中键值的逻辑顺序决定了表中相应行的物理顺序。 聚集索引确定表中数据的物理顺序。聚集索引类似于电话簿,后者按姓氏排列数据。由于聚集索引规定数据在表中的物理存储顺序,因此一个表只能包含一

实验四 存储过程、触发器与索引 一、实验目的 1. 熟悉大型数据库实验环境,以MS SQL SERVER为例。 2. 掌握视图。 3. 掌握存储过程与触发器。 4. 掌握MS SQL SERVER的导入和导出。 5. 掌握MS SQL SERVER的索引。 二、实验内容 (1)使用"实验一"数据库"abc",创建一个视图,生产厂家为"北京"且价格低于 北京生产的产品的平均价格,输出产品的名称、价格和生产厂家。 (2)使用"实验一"数据库"abc",创建一个带有输入参数的存储过程proc_abc, 查询指定职工的销售记录,用户输入职工编号,存储过程返回职工名称、产品名称、 销售日期、销售数量,假如执行存储过程时所提供的"职工编号"不存在,存储过程应 给予一定的提示。 (3)使用"实验一"数据库"abc",练习使用游标, 写出按如下报形式显示结果的SQL语句,该报查询每年每种产品总销售金额,( 总销售金额=价格*销量),报显示格式如下所示: 年 产品号 产品名 销售总量 总销售金额(万元) 2001年 2 AAA 590 3.2 2001年 5 BBB 644 23.3 2002年 1 CCC 32 0.2 (4)使用"实验一"数据库"abc",练习使用触发器,在销售创建触发器tr_ updateprice,每次新增销售记录时,自动更新产品的单价,更新方法是:每增加 一笔销售记录,就将该产品的单价减去1块钱。 (5)将100万行网络连接监控数据Netflow导入数据库创建多个索引,观察创建索 引对数据库文件大小的影响;并设计不同的查询语句来观察索引对查询效率的影响; 可以尝试将100万行记录扩展为1000万行,然后再做索引和查询的实验?文件见附件 。 三、实验结果和代码 use abc go create view abc as select CPM,JG,SCCJ from CPB where SCCJ like '@北京@' and JG<(select AVG(JG) from CPB where SCCJ like '@北京@' ); create procedure proc_abc @zgh_yh nchar(6) as if exists(select zgh from xsryb where zgh=@zgh_yh) select xsryb.xm,cpb.cpm,xsqkb.xsrq,xsqkb.xssl from xsryb,cpb,xsqkb where xsqkb.cph=cpb.cph and xsqkb.zgh=xsryb.zgh and xsryb.zgh=@zgh_yh print '存在' if not exists(select zgh from xsryb where zgh=@zgh_yh) print '提供的职工号不存在' exec proc_abc @zgh_yh='G11'; declare abc_cursor cursor for select year(xsrq) ,cpb.cph,cpb.cpm ,xsqkb.xssl ,cpb.jg*xsqkb.xssl from cpb,xsqkb where xsqkb.cph=cpb.cph open abc_cursor declare @year_abc int,@cph_abc nchar(6),@cpm_abc nvarchar(20),@xszl_abc int,@xsze_abc int fetch next from abc_cursor into @year_abc, @cph_abc,@cpm_abc ,@xszl_abc,@xsze_abc while @@FETCH_STATUS = 0 begin if(@year_abc in(select 年 from nxsb)and @cph_abc in (select 产品号 from nxsb where 年=@year_abc)) begin update nxsb set 销售总量=销售总量+@xszl_abc where 年=@year_abc and 产品号=@cph_abc update nxsb set 总销售金额=总销售金额+@xsze_abc where 年=@year_abc and 产品号=@cph_abc end if (@year_abc not in (select 年 from nxsb) ) begin insert into nxsb values(@year_abc,@cph_abc,@cpm_abc,@xszl_abc,@xsze_abc) end if(@year_abc in(select 年
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值