`

关于sql中索引的优缺点(面试常考)

 
阅读更多

一、为什么要创建索引呢(优点)?
创建索引可以大大提高系统的性能。
第一, 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
第二, 可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
第三, 可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
第四, 在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
第五, 通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。

二、建立方向索引的不利因素(缺点)
也许会有人要问:增加索引有如此多的优点,为什么不对表中的每一个列创建一个索引呢?这种想法固然有其合理性,然而也有其片面性。虽然,索引有许多优点,但是,为表中的每一个列都增加索引,是非常不明智的。这是因为,增加索引也有许多不利的一个方面。

第一, 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
第二, 索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
第三, 当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。

三、创建方向索引的准则
索引是建立在数据库表中的某些列的上面。因此,在创建索引的时候,应该仔细考虑在哪些列上可以创建索引,在哪些列上不能创建索引。
一般来说,应该在这些列上创建索引。
第一, 在经常需要搜索的列上,可以加快搜索的速度
第二, 在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构;
第三, 在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度
第四, 在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;
第五, 在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;
第六, 在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。

同样,对于有些列不应该创建索引。一般来说,不应该创建索引的的这些列具有下列特点:
第一, 对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。
第二, 对于那些只有很少数据值的列也不应该增加索引。这是因为,由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。
第三, 对于那些定义为text, image和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。
第 四, 当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改性能远远大于检索性能时,不应该创建索引。
四、创建索引的方法
创建索引有多种方法,这些方法包括直接创建索引的方法和间接创建索引的方法。
第一, 直接创建索引,例如使用CREATE INDEX语句或者使用创建索引向导。
第二, 间接创建索引,例如在表中定义主键约束或者唯一性键约束时,同时也创建了索引。
虽然,这两种方法都可以创建索引,但是,它们创建索引的具体内容是有区别的。
使 用CREATE INDEX语句或者使用创建索引向导来创建索引,这是最基本的索引创建方式,并且这种方法最具有柔性,可以定制创建出符合自己需要的索引。在使用这种方式创建索引时,可以使用许多选项,例如指定数据页的充满度、进行排序、整理统计信息等,这样可以优化索引。使用这种方法,可以指定索引的类型、唯一性和复合性,也就是说,既可以创建聚簇索引,也可以创建非聚簇索引,既可以在一个列上创建索引,也可以在两个或者两个以上的列上创建索引。
通过定义主键约束或者唯一性键约束,也可以间接创建索引。主键约束是一种保持数据完整性的逻辑,它限制表中的记录有相同的主键记录。在创建主键约束时,系统自动创建了一个唯一性的聚簇索引。虽然,在逻辑上,主键约束是一种重要的结构,但是,在物理结构上,与主键约束相对应的结构是唯一性的聚簇索引。换句话说,在物理实现上,不存在主键约束,而只存在唯一性的聚簇索引。同样,在创建唯一性键约束时,也同时创建了索引,这种索引则是唯一性的非聚簇索引。因此,当使用约束创建索引时,索引的类型和特征基本上都已经确定了,由用户定制的余地比较小。
当在表上定义主键或者唯一性键约束时,如果表中已经有了使用 CREATE INDEX语句创建的标准索引时,那么主键约束或者唯一性键约束创建的索引覆盖以前创建的标准索引。也就是说,主键约束或者唯一性键约束创建的索引的优先级高于使用CREATE INDEX语句创建的索引。
五、索引的特征
索引有两个特征,即唯一性索引和复合索引。
唯一性索引保证在索引列中的全部数据是唯一的,不会包含冗余数据。如果表中已经有一个主键约束或者唯一性键约束,那么当创建表或者修改表时,SQL Server自动创建一个唯一性索引。然而,如果必须保证唯一性,那么应该创建主键约束或者唯一性键约束,而不是创建一个唯一性索引。当创建唯一性索引时,应该认真考虑这些规则:当在表中创建主键约束或者唯一性键约束时,SQL Server自动创建一个唯一性索引;如果表中已经包含有数据,那么当创建索引时,SQL Server检查表中已有数据的冗余性;每当使用插入语句插入数据或者使用修改语句修改数据时,SQL Server检查数据的冗余性:如果有冗余值,那么SQL Server取消该语句的执行,并且返回一个错误消息;确保表中的每一行数据都有一个唯一值,这样可以确保每一个实体都可以唯一确认;只能在可以保证实体完整性的列上创建唯一性索引,例如,不能在人事表中的姓名列上创建唯一性索引,因为人们可以有相同的姓名。
复合索引就是一个索引创建在两个列或者多个列上。在搜索时,当两个或者多个列作为一个关键值时,最好在这些列上创建复合索引。当创建复合索引时,应该考虑这些规则:最多可以把16个列合并成一个单独的复合索引,构成复合索引的列的总长度不能超过900字节,也就是说复合列的长度不能太长;在复合索引中,所有的列必须来自同一个表中,不能跨表建立复合列;在复合索引中,列的排列顺序是非常重要的,因此要认真排列列的顺序,原则上,应该首先定义最唯一的列,例如在(COL1,COL2)上的索引与在(COL2,COL1)上的索引是不相同的,因为两个索引的列的顺序不同;为了使查询优化器使用复合索引,查询语句中的WHERE子句必须参考复合索引中第一个列;当表中有多个关键列时,复合索引是非常有用的;使用复合索引可以提高查询性能,减少在一个表中所创建的索引数量。
六、索引的类型
根据索引的顺序与数据表的物理顺序是否相同,可以把索引分成两种类型。一种是数据表的物理顺序与索引顺序相同的聚簇索引,另一种是数据表的物理顺序与索引顺序不相同的非聚簇索引。
七、聚簇索引的体系结构
索引的结构类似于树状结构,树的顶部称为叶级,树的其它部分称为非叶级,树的根部在非叶级中。同样,在聚簇索引中,聚簇索引的叶级和非叶级构成了一个树状结构,索引的最低级是叶级。在聚簇索引中,表中的数据所在的数据页是叶级,在叶级之上的索引页是非叶级,索引数据所在的索引页是非叶级。在聚簇索引中,数据值的顺序总是按照升序排列。
应该在表中经常搜索的列或者按照顺序访问的列上创建聚簇索引。当创建聚簇索引时,应该考虑这些因素:每一个表只能有一个聚簇索引,因为表中数据的物理顺序只能有一个;表中行的物理顺序和索引中行的物理顺序是相同的,在创建任何非聚簇索引之前创建聚簇索引,这是因为聚簇索引改变了表中行的物理顺序,数据行按照一定的顺序排列,并且自动维护这个顺序;关键值的唯一性要么使用UNIQUE关键字明确维护,要么由一个内部的唯一标识符明确维护,这些唯一性标识符是系统自己使用的,用户不能访问;聚簇索引的平均大小大约是数据表的百分之五,但是,实际的聚簇索引的大小常常根据索引列的大小变化而变化;在索引的创建过程中,SQL Server临时使用当前数据库的磁盘空间,当创建聚簇索引时,需要1.2倍的表空间的大小,因此,一定要保证有足够的空间来创建聚簇索引。
当系统访问表中的数据时,首先确定在相应的列上是否存在有索引和该索引是否对要检索的数据有意义。如果索引存在并且该索引非常有意义,那么系统使用该索引访问表中的记录。系统从索引开始浏览到数据,索引浏览则从树状索引的根部开始。从根部开始,搜索值与每一个关键值相比较,确定搜索值是否大于或者等于关键值。这一步重复进行,直到碰上一个比搜索值大的关键值,或者该搜索值大于或者等于索引页上所有的关键值为止。

系统如何访问表中的数据
一般地,系统访问数据库中的数据,可以使用两种方法:表扫描和索引查找。第一种方法是表扫描,就是指系统将指针放置在该表的表头数据所在的数据页上,然后按照数据页的排列顺序,一页一页地从前向后扫描该表数据所占有的全部数据页,直至扫描完表中的全部记录。在扫描时,如果找到符合查询条件的记录,那么就将这条记录挑选出来。最后,将全部挑选出来符合查询语句条件的记录显示出来。第二种方法是使用索引查找。索引是一种树状结构,其中存储了关键字和指向包含关键字所在记录的数据页的指针。当使用索引查找时,系统沿着索引的树状结构,根据索引中关键字和指针,找到符合查询条件的的记录。最后,将全部查找到的符合查询语句条件的记录显示出来。
在SQL Server中,当访问数据库中的数据时,由SQL Server确定该表中是否有索引存在。如果没有索引,那么SQL Server使用表扫描的方法访问数据库中的数据。查询处理器根据分布的统计信息生成该查询语句的优化执行规划,以提高访问数据的效率为目标,确定是使用表扫描还是使用索引。

分享到:
评论

相关推荐

    SQL精选面试题

    触发器的作用 索引的作用?和它的优点缺点是什么 什么是内存泄漏 什么是事务?什么是锁? 什么叫视图?游标是什么 什么是索引?SQL Server 2000里有什么类型的索引

    分享几道关于MySQL索引的重点面试题

    假如我们用类比的方法,数据库中的索引就相当于书籍中的目录一样,当我们想找到书中的摸个知识点,我们可以直接去目录中找而不是在书中每页的找,但是这也抛出了索引的一个缺点,在对数据库修改的时候要修改索引到...

    SQL经典面试题目

    答:存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。可以用一个命令对象来调用...

    java开发面试必问_自我总结.docx

    索引、存储过程、函数语法及各自的优缺点。等 电商系列问题:产品详情页;静态化介绍;支付;商品管理模块;报表统计;统计分析模块。等 非专业知识: 大学情况; 上家公司; 有没有上过保险; 没有上五险一金的原因...

    BAT面试突击资料.zip

    文章目录数据库基础知识为什么要使用数据库什么是SQL?什么是MySQL?数据库三大范式是什么mysql有关权限的表都有哪几个MySQL的binlog有有几种录入格式?...索引有哪些优缺点?索引使用场景(重点)..._mysql 面试题 2020

    SQL面试题目汇总.pdf

    触发器的作用?什么是存储过程?用什么来调用?索引的作用?和它的优点缺点是什么?什么是内存泄漏?...你能向我简要叙述一下SQL Server 2000中使用的一些数据库对象吗?游标:是对查询出来的结果集作为一个单元..

    常见(MySQL)面试题(含答案).docx

    优缺点 MySQL 索引使用的注意事项 SQL怎么优化 数据库悲观锁和乐观锁的原理和应用场景? 如何做 MySQL 的性能优化? 索引是什么?MySQL为什么使用B+树,而不是使用其他?B+树的特点 创建索引时需要注意什么? CHAR和...

    mysql面试题,面试会问到的基础问题

    10. 你能向我简要叙述一下SQL Server 中使用的一些数据库对象吗? 11. NULL是什么意思? 12. 什么是索引,有哪些索引,具体怎么用? 13. SQL Server 里有什么类型的索引? 14. 什么是主键? 15. 什么是外键? 16. 什么...

    MySQL自整理超全精华版面试八股文

    索引的优缺点 MySQL的索引有哪些? B树和B+树有什么异同? MySQL为什么使用B+树而不是B树? 主键索引和辅助索引(二级索引) 聚簇索引和非聚簇索】 非聚簇索引一定会回表查询吗?(要盖索) 联合索引 最左前缀匹配...

    18道经典 MySQL 面试题.txt

    18道经典 MySQL 面试题。1、用一句话介绍什么是MySQL?2、对MySQL数据库去重的关键字是什么?...16、日常工作中,你是怎么优化sql的?17、什么情况下应不建或少建索引?18、了解什么是表分区吗?表分区的好处有哪些?

    开发、测试、资料面试题集锦

    索引有哪些优缺点?你做项目的时候,知道那些SQL语句会触发索引? 15.向一张表中如何插入一组数据? 16.索引的作用 17.关于loadruuner的一些关注问题 18.SQL中查询、修改、嵌套查询、 19.关于加班的态度 20....

    Java面试Mysql.pdf

    索引的优点和缺点 怎么避免索引失效(也属于sql优化的一种) 一条sql查询非常慢,我们怎么去排查和优化? 存储引擎 MylSAM和InnoDB、Memory的区别 事务的四大特性(ACID) 脏读、不可重复读、幻读 事务的隔离级别? 怎么...

    Java开发工程师面试题资料

    1. 说出一些数据库优化方面的经验?...13. 什么是存储过程,有什么优缺点(重点) 14. 存储过程与 SQL 的区别? 15. 如何创建视图? 16. JAVA 中常用的运算符有哪些?这些运算符之间的优先级怎么样?

    数据库+研究生复试+求职+面试题

    汇总了计算机研究生复试有关编译原理各章节简答题,使用了易于口头表达的语言进行了总结。...11. 索引的优点和缺点 2. 解释1到4范式和BC范式? 3. 如何判断复杂关系模式中的候选码 4. 什么是数据库设计? ... ..

    MySQL数据库面试题(2020最新版)

    索引有哪些优缺点?索引使用场景(重点)索引有哪几种类型?索引的数据结构(b树,hash)索引的基本原理索引算法有哪些?索引设计的原则?创建索引的原则(重中之重)创建索引的三种方式,删除索引创建索引时需要...

    MySQL面试题-2023

    MySQL如何执行数据的备份和恢复? MySQL中什么是主键?在MySQL中如何定义一个主键? 什么是SQL注入?如何防止? ...什么是索引?MySQL中有哪些索引类型?... MySQL的InnoDB和MyISAM两个存储引擎各有什么优缺点?

    面试问题1

    2. HiveSQL和MySQL的区别 3. 实践中如何优化MySQL 5. 数据库建立索引的优缺点:·答:优点:① 通过创建唯一性索引,可以保证数据库表中每一

    Mysql索引常见问题汇总

    缺点是只能从索引的最左列开始查找,也不能跳过索引中的列,如果查询中有某个列用到了范围查询,则右边所有列都无法使用索引优化查找。 2.哈希索引:基于哈希表实现。在MySQL中,只有Memory引擎显式的支持哈希搜索。...

    Java面试宝典2020修订版V1.0.1.doc

    3、存储过程的优缺点? 40 4、存储过程与函数的区别 41 5、索引的作用?和它的优点缺点是什么? 41 6、什么样的字段适合建索引 41 7、索引类型有哪些? 42 8、什么是事务?什么是锁? 42 9、什么叫视图?游标是什么...

    Java常见面试题208道.docx

    面试题包括以下十九部分:Java 基础、容器、多线程、反射、对象拷贝、Java Web 模块、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、Mybatis、RabbitMQ、Kafka、Zookeeper、MySql...

Global site tag (gtag.js) - Google Analytics