列上加索引时事有条件

在列上加索引时事有条件的:
1、经常被查询的列
2、order by子句中使用的列
3、是外键或者主键的列
4、列是唯一的列
5、两个或多个列经常同时出现在where子句中或者连接条件中

一般来说,应该在这些列上创建索引:

1在经常需要搜索的列上,可以加快搜索的速度;

2在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构;

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

4在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;

5在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;

6在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。

同样,对于有些列不应该创建索引。一般来说,不应该创建索引的的这些列具有下列特点:

第一,对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。

第二,对于那些只有很少数据值的列也不应该增加索引。这是因为,由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。

第三,对于那些定义为text, image和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。

第四,当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改性能远远大于检索性能时,不应该创建索引。

根据数据库的功能,可以在数据库设计器中创建三种索引:唯一索引、主键索引和聚集索引

唯一索引

唯一索引是不允许其中任何两行具有相同索引值的索引。

当现有数据中存在重复的键值时,大多数数据库不允许将新创建的唯一索引与表一起保存。数据库还可能防止添加将在表中创建重复键值的新数据。例如,如果在employee表中职员的姓(lname)上创建了唯一索引,则任何两个员工都不能同姓。主键索引数据库表经常有一列或列组合,其值唯一标识表中的每一行。该列称为表的主键。在数据库关系图中为表定义主键将自动创建主键索引,主键索引是唯一索引的特定类型。该索引要求主键中的每个值都唯一。当在查询中使用主键索引时,它还允许对数据的快速访问。聚集索引在聚集索引中,表中行的物理顺序与键值的逻辑(索引)顺序相同。一个表只能包含一个聚集索引。

如果某索引不是聚集索引,则表中行的物理顺序与键值的逻辑顺序不匹配。与非聚集索引相比,聚集索引通常提供更快的数据访问速度。

时间: 2024-08-02 10:24:20

列上加索引时事有条件的相关文章

SQL Server如何在变长列上存储索引

原文:SQL Server如何在变长列上存储索引 这篇文章我想谈下SQL Server如何在变长列上存储索引.首先我们创建一个包含变长列的表,在上面定义主键,即在上面定义了聚集索引,然后往里面插入80000条记录: 1 -- Create a new table 2 CREATE TABLE Customers 3 ( 4 CustomerName VARCHAR(255) NOT NULL PRIMARY KEY, 5 Filler CHAR(138) NOT NULL 6 ) 7 GO 8

VARCHAR列上的索引

一年前,我写了在索引的导航结构里,SQL Server如何存储VARCHAR列.我们都知道,在SQL Server里索引(聚集索引,非聚集索引)的键列有最大900byte的大小限制. 假设现在你想捉弄下SQL Server,在VARCHAR(8000)的列上创建一个索引,并在索引键列上插入超900byte的值.想想,SQL Server会如何反应?不知道?我们来试验下.在下列代码里,我创建了有VARCHAR(8000)列的表,并在这列上创建非聚集索引. USE TempDb GO -- Crea

非索引列上的统计 <第二篇>

非索引列上的统计 有时候,可能在连接或过滤条件中的列上没有索引.即使对这种非索引列,如果查询优化器知道这些列的数据分布(统计),它也很可能做出最佳的选择. 除了索引上的统计,SQL Server可以在没有索引的列上建立统计.即使不是索引列,当你开启了SQL Server自动创建统计功能,SQL Server就自动在执行WHERE.JOIN等查询列上创建统计.数据分布的信息或者特定值出现在非索引列上的可能性,都能够帮助查询优化器确定最优的处理策略.即使查询优化器不能真正使用索引来定位这些列,这也仍

在计算列中创建索引提高性能

前言:在理解计算列上的索引之前,先了解计算列的基本知识.计算列由可以使用同一表中的其他列的表达式计算得来.表达式可以是非计算列的列名.常量.函数,也可以是用一个或多个运算符连接的上述元素的任意组合.表达式不能为子查询.默认情况下,计算列是一个虚拟的列,并且可以在调用时重新计算,直到在CREATE TABLE或者ALTER TABLE 命令中使用PERSISTED.如果列定义成PERSISTED,会存放计算值,并存放在原始列上更新后的汇总值,不能对计算列进行INSERT.UPDATE. 准备工作:

Atitit.  单列索引与多列索引 多个条件的查询原理与设计实现

Atitit.  单列索引与多列索引 多个条件的查询原理与设计实现 1. MySQL只能使用一个索引1 1.1. 最左前缀1 1.2. 从另一方面理解,它相当于我们创建了(firstname,lastname,age).(firstname,lastname)以及(firstname)这些列组合上的索引.2 2. 一条 sql 可以使用多个索引2 2.1. 什么是索引合并2 2.2. 使用索引合并有啥收益3 2.3. 具体的索引合并流程 4 3. Referred.4 1. MySQL只能使用一

SqlServer在视图上创建索引的条件

在视图上创建索引需要三个条件: 一.视图必须绑定到架构. 要做到这点,在 CREATE VIEW 语句中,必须加上 WITH SCHEMABINDING,如果是使用企业管理器,则在设计界面的空白处点击右键,属性,选中“绑定到架构”. 二.索引必须是唯一索引.  www.2cto.com 要做到这点,在 CREATE INDEX 中必须指定 UNIQUE. 三.索引必须是聚集索引. 要做到这点,在 CREATE INDEX 中必须指定 CLUSTERED. 例: CREATE VIEW viewF

索引列上的统计 <第一篇>

一.索引在查询优化中的角色 SQL Server的查询优化器是基于开销的优化器.它通过确认选择性.数据的唯一性以及过滤数据(通过WHERE或JOIN子句)所使用的列来决定最佳的数据访问机制.统计与索引一同存在,但是它们也作为断言的一部分存在于没有索引的列上. 作为谓词引用的列中数据分布的最新信息帮助优化器确定所使用的查询策略.在SQL Server中,这个信息以统计的形式维护,这对于基于开销的优化器创建一个有效的查询执行计划是很重要的.通过统计,优化器能做出返回结果集或中间结果集所花费时间的精确

为什麽我们一般会在自增列或交易时间列上建立聚集索引?

http://www.cnblogs.com/lyhabc/p/3533027.html 一般的交易系统里面我们都会以自增列或交易时间列作为聚集索引列,因为一般这些系统都是写多读少 每天的交易数据会不停的插入到数据库,但是读取数据就没有数据插入那么频繁 因为这些系统一般是写多读少,所以我们会选择在自增列或交易时间列上建立聚集索引 测试 测试环境:SQLSERVER2012 SP1  WINDOWS7 64位 我们来做一个测试,测试脚本如下: 1 --测试脚本 插入性能 2 USE [test]

经验分享(2)为什么hive在大表上加条件后执行limit很慢

问题重现 select id from big_table where name = 'sdlkfjalksdjfla' limit 100; 首先看执行计划: hive> explain select * from big_table where name = 'sdlkfjalksdjfla' limit 100; OK STAGE DEPENDENCIES: Stage-0 is a root stage STAGE PLANS: Stage: Stage-0     Fetch Oper