#MYSQL#本篇继续延续上篇的数据库索引的优化技巧,本篇主要是介绍使用UNIQUE关键字来创建唯一索引,以及索引的使用时需要注意的地方。
使用UNIQUE关键字创建唯一索引,唯一索引是指不允许在两行中存在相同的素引值。惟-索引可以拥有一行或者多行。如果用户试图使用INSERT或UPDATE语句。在拥有唯一素引的数据中生成-一个重复的值。那么INSERT或者UPDATE就会被终止,SQL服务器会生成一个错误信息。
创建并强制使用唯一索引检索表为Sudendlnfo表中的学号(3)字段创建性-素引Sno.Index.且指定降序排序。CHEATEUNIQUEINDEXsno.IndexONStudentInfoDESC强制使用Sno.Index索引,查询Sudentnfto表中的所有记录。SELECTFRONstudentIntoNITH(INDEX(8no_Index1)
当制建唯一常引时。我们应确保被索引的列不允评NULL值。例如,SQLServer将NULL也看作是一个值。如果创建惟一常引得到允许NULL值,假定原先谊列不存在主义NULL值。那么向其中插入NULL值时,第一个是合法的。第二个就会失败。因为两个NULL值被视为违背唯一性原则。
当然,创建唯一性索引的前提是,创建索引的列中已有的记录本身没有重复的值。否则,.系统会报错,创建失败。具有重复值字段的惟一性索引的创建为StudentInfo表中的address字段创建性-索引AddresIndex.CREATEUNIQUEINDEXaddre88_Index08studentInfoladres)
SQLServer数据库系统会报错,在查询分析器的Result窗格将显示如下信息。CREATEUNIQUEINDEXterminatedbecauseduplicatekeyMastoundtorindexMo8tsigniELeantprinarykeyThestatenenthasbeenterninated.
这是因为在Sudentlnfo表的adress列中,其值不是唯一的(包含两个“山东”记录)。因此对其创建唯一性索引将导致创建失败。
使用CLUSTERDE关键字创建簇索引与非族索引不同,族索引改变了表中数据存放的物理位置。在带有族索引的表中,行是以索引顺序存放的。族索引不仅对索引中的键字值进行排序,而且对表中的行排序。以便使其与索引的排序相匹配。使用族集索引主要有三点优势。
使用簇集索引的表将占用最小的磁盘空间。因为DBMS在插入断行时,会自动地重用以前分配给删除行的空间。
对基于簇集索引的列值进行查询时,会有更快的执行速度,因为所有值在物理磁盘上相互靠近。基于非聚集索引的列以升序显示数据查询。不再需要ORDERBY子句。因为表的数据本身已经按所要求的输出顺序排列。
当检索带有连续键值得多行时,如查询姓王的所有学生时,簇索引就显示出很多优势。一旦找到了第-一个键值,后续索引值的行必定物理地排在后面,这样就无需进一-步访问磁盘了。
使用索引的几点原则前面我们介绍了索引的创建和销毁。在一个表中,什么时候需要创建索引,创建索引又需要注意些什么呢?下面是创建索引时,需要注意的几点。
对小的数据表来说,使用意引并不能提高检索效率。因此不需对其创建索引。当用户要检索的字段的数据包含有很多数值或很多空值(NULL)时,为该字段创建常引,会大大提高检索效率。
当用户查询表中的数据时。如果查询结果包含的数据(行)较少,一般少于数据的25%时,使用索引会显著提高查询效率。反之。如果用户的查询操作結果,总是包含大量数据,那么索引的用处不大。
索引列在WHERE子句中应频繁使用。例如,我们在学生姓名字段上建了索引。但实际查询中并不是经常用姓名作为查询条件,该索引就没有发生作用。
我们要先装数据,后建索引。对于大多数的表,总有一批初始数据需要装入。该原则是说,建立表后,我们要先将这些初始数据装入表,热后再建常引,这样可以加快初始数据的最入。如果建表后就建索引。那么在输入初始数据时,每插入一个记最都要维护一次索引;当然,对于索引来说,早建和晚建都是允评的。
索引提高了数据检索的速度,但也降低了数据更断的速度。如果要对表中的数据进行大量更断。我们最好先销毁索引,等数据更断完毕再创建索引,这样会提高效率。.
索引要占用数据库空间。在设计数据库时,我们要把需要的索引空间考虑在内。我们要尽量把表和它的索引存放在不同的磁盘上,这样会提高查询速度。