`

索引使用

阅读更多

前些时候,一位颇高级的程式员居然问我什么叫做索引,令我感到十分的惊奇,我想这绝不会是沧海一粟,因为有成千上万的研发者(可能大部分是使用MySQL 的)都没有受过有关数据库的正规培训,尽管他们都为客户做过一些研发,但却对如何为数据库建立适当的索引所知较少,因此我起了写一篇相关文章的念头。

最普通的情况,是为出现在where子句的字段建一个索引。为方便讲述,我们先建立一个如下的表。

CREATE TABLE mytable (
id serial primary key,
category_id int not null default 0,
user_id int not null default 0,
adddate int not null default 0
);

很简单吧,但是对于要说明这个问题,已足够了。假如您在查询时常用类似以下的语句:

SELECT * FROM mytable WHERE category_id=1;

最直接的应对之道,是为category_id建立一个简单的索引:

CREATE INDEX mytable_categoryid
ON mytable (category_id);

OK,搞定?先别高兴,假如您有不止一个选择条件呢?例如:

SELECT * FROM mytable WHERE category_id=1 AND user_id=2;

您的第一反应可能是,再给user_id建立一个索引。不好,这不是个最好的方法。您能够建立多重的索引。

CREATE INDEX mytable_categoryid_userid ON mytable (category_id,user_id);

注意到我在命名时的习惯了吗?我使用"表名_字段1名_字段2名"的方式。您很快就会知道我为什么这样做了。

现在您已为适当的字段建立了索引,但是,还是有点不放心吧,您可能会问,数据库会真正用到这些索引吗?测试一下就OK,对于大多数的数据库来说,这是很容易的,只要使用EXPLAIN命令:

EXPLAIN

SELECT * FROM mytable
WHERE category_id=1 AND user_id=2;

This is what Postgres 7.1 returns (exactly as I expected)

NOTICE: QUERY PLAN:

Index Scan using mytable_categoryid_userid on
mytable (cost=0.00..2.02 rows=1 width=16)

EXPLAIN

以上是postgres的数据,能够看到该数据库在查询的时候使用了一个索引(一个好开始),而且他使用的是我创建的第二个索引。看到我上面命名的好处了吧,您马上知道他使用适当的索引了。
接着,来个稍微复杂一点的,假如有个ORDER BY字句呢?不管您信不信,大多数的数据库在使用order by的时候,都将会从索引中受益。

SELECT * FROM mytable
WHERE category_id=1 AND user_id=2
ORDER BY adddate DESC;

有点迷惑了吧?很简单,就象为where字句中的字段建立一个索引相同,也为ORDER BY的字句中的字段建立一个索引:

CREATE INDEX mytable_categoryid_userid_adddate
ON mytable (category_id,user_id,adddate);

注意: "mytable_categoryid_userid_adddate" 将会被截短为

"mytable_categoryid_userid_addda"

CREATE

EXPLAIN SELECT * FROM mytable
WHERE category_id=1 AND user_id=2
ORDER BY adddate DESC;

NOTICE: QUERY PLAN:

Sort (cost=2.03..2.03 rows=1 width=16)
-> Index Scan using mytable_categoryid_userid_addda
on mytable (cost=0.00..2.02 rows=1 width=16)

EXPLAIN

看看EXPLAIN的输出,好象有点恐怖啊,数据库多做了一个我们没有需要的排序,这下知道性能如何受损了吧,看来我们对于数据库的自身运作是有点过于乐观了,那么,给数据库多一点提示吧。

为了跳过排序这一步,我们并无需其他另外的索引,只要将查询语句稍微改一下。这里用的是postgres,我们将给该数据库一个额外的提示 --在ORDER BY语句中,加入where语句中的字段。这只是个技术上的处理,并不是必须的,因为实际上在另外两个字段上,并不会有任何的排序操作,但是假如加入,postgres将会知道哪些是他应该做的。

EXPLAIN SELECT * FROM mytable
WHERE category_id=1 AND user_id=2
ORDER BY category_id DESC,user_id DESC,adddate DESC;

NOTICE: QUERY PLAN:

Index Scan Backward using
mytable_categoryid_userid_addda on mytable
(cost=0.00..2.02 rows=1 width=16)

EXPLAIN

现在使用我们料想的索引了,而且他还挺聪明,知道能够从索引后面开始读,从而避免了任何的排序。

以上说得细了一点,但是假如您的数据库很巨大,并且每日的页面请求达上百万算,我想您会获益良多的。但是,假如您要做更为复杂的查询呢,例如将多张表结合起来查询,特别是where限制字句中的字段是来自不止一个表格时,应该怎样处理呢?我通常都尽量避免这种做法,因为这样数据库要将各个表中的东西都结合起来,然后再排除那些不合适的行,搞不好开销会很大。

假如不能避免,您应该查看每张要结合起来的表,并且使用以上的策略来建立索引,然后再用EXPLAIN命令验证一下是否使用了您料想中的索引。假如是的话,就OK。不是的话,您可能要建立临时的表来将他们结合在一起,并且使用适当的索引。

要注意的是,建立太多的索引将会影响更新和插入的速度,因为他需要同样更新每个索引文档。对于一个经常需要更新和插入的表格,就没有必要为一个很少使用的where字句单独建立索引了,对于比较小的表,排序的开销不会很大,也没有必要建立另外的索引。

以上介绍的只是一些十分基本的东西,其实里面的学问也不少,单凭EXPLAIN我们是不能判定该方法是否就是最优化的,每个数据库都有自己的一些优化器,虽然可能还不太完善,但是他们都会在查询时对比过哪种方式较快,在某些情况下,建立索引的话也未必会快,例如索引放在一个不连续的存储空间时,这会增加读磁盘的负担,因此,哪个是最优,应该通过实际的使用环境来检验。

在刚开始的时候,假如表不大,没有必要作索引,我的意见是在需要的时候才作索引,也可用一些命令来优化表,例如MySQL可用"OPTIMIZE TABLE"。

综上所述,在如何为数据库建立恰当的索引方面,您应该有一些基本的概念了。

一、索引的概念

索引就是加快检索表中数据的方法。数据库的索引类似于书籍的索引。在书籍中,索引允许用户不必翻阅完整个书就能迅速地找到所需要的信息。在数据库中,索引也允许数据库程序迅速地找到表中的数据,而不必扫描整个数据库。

二、索引的特点

1.索引可以加快数据库的检索速度

2.索引降低了数据库插入、修改、删除等维护任务的速度

3.索引创建在表上,不能创建在视图上

4.索引既可以直接创建,也可以间接创建

5.可以在优化隐藏中,使用索引

6.使用查询处理器执行SQL语句,在一个表上,一次只能使用一个索引

7.其他

三、索引的优点

1.创建唯一性索引,保证数据库表中每一行数据的唯一性

2.大大加快数据的检索速度,这也是创建索引的最主要的原因

3.加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。

4.在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。

5.通过使用索引,可以在查询的过程中使用优化隐藏器,提高系统的性能。

四、索引的缺点

1.创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加

2.索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大

3.当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度

五、索引分类

1.直接创建索引和间接创建索引

直接创建索引: CREATE INDEX mycolumn_index ON mytable (myclumn)

间接创建索引:定义主键约束或者唯一性键约束,可以间接创建索引

2.普通索引和唯一性索引

普通索引:

CREATE INDEX mycolumn_index ON mytable (myclumn)

唯一性索引:保证在索引列中的全部数据是唯一的,对聚簇索引和非聚簇索引都可以使用

CREATE UNIQUE COUSTERED INDEX myclumn_cindex ON mytable(mycolumn)

分享到:
评论
1 楼 zhoulei984623 2008-08-14  
http://www.iteye.com/topic/227161?page=1

相关推荐

    oracle索引使用样例

    ### Oracle索引使用样例详解 #### 一、索引并行创建 在Oracle数据库中,并行创建索引可以显著提高创建索引的速度,尤其是在处理大量数据时。下面的SQL语句展示了如何并行创建一个索引: ```sql CREATE INDEX IDX_GD...

    Oracle 索引 使用方法

    Oracle 索引 使用方法,索引 使用原理, 索引 使用顺序过程

    索引使用规则.txt

    根据“索引使用规则.txt”文件提供的信息,我们可以深入探讨一系列关于索引使用的最佳实践与限制条件,以下是对这些规则的详细解析: ### 1. 索引与逻辑运算符的兼容性 当在WHERE子句中使用`NOT`或`LIKE '%XX%'`这...

    MySQL索引 使用笔记

    本笔记将深入探讨MySQL中的索引使用,旨在帮助你提升数据库性能。 1. 索引的概念与类型: - 索引是一种数据结构,用于快速定位表中的特定行,类似于书籍的目录。 - MySQL支持多种类型的索引,包括B-Tree(默认)...

    V1.0-sqlServer索引使用总结.docx

    SQL Server 索引使用总结 本文档总结了 SQL Server 中索引的使用方法、分类和注意事项,并提供了实践测试的示例代码。 索引的使用目的 索引的使用目的主要是为了提高查询速度和效率。通过创建索引,可以快速地...

    11、MongoDB聚合操作及索引使用详解-ev.rar

    11、MongoDB聚合操作及索引使用详解_ev.rar11、MongoDB聚合操作及索引使用详解_ev.rar11、MongoDB聚合操作及索引使用详解_ev.rar11、MongoDB聚合操作及索引使用详解_ev.rar11、MongoDB聚合操作及索引使用详解_ev.rar...

    Oracle 监控索引使用率脚本分享

    例如,脚本的输出显示了几个表的索引使用情况,如ACC_POS_CASH_PL_TBL_ARC表的主键索引PK_ACC_POS_CASH_PL_ARCH_TBL,执行了多次RANGE SCAN, UNIQUE SCAN, SAMPLE FAST FULL SCAN和SKIP SCAN操作。通过比较不同操作...

    mysql高性能索引查询(查询性能问题、索引使用原则、索引创建、索引的优点缺点).docx

    ##### 2、索引使用原则 索引的使用并非越多越好,而是在充分理解业务场景的基础上,根据查询需求来设计。例如,在电商系统中: - **用户方**:通常会基于用户ID(user_id)进行查询,也可以通过订单号(order_no)查询...

    MySQL 进阶-索引使用规则

    以下将详细介绍MySQL中的索引使用规则及其相关知识。 1. **创建索引** - **CREATE INDEX** 语句用于在表的列上创建索引,例如:`CREATE INDEX idx_name ON table_name (column_name);` - **唯一性索引**:`UNIQUE...

    索引使用技巧大全宝典

    【索引使用技巧大全宝典】 索引是数据库系统中不可或缺的一部分,它们极大地提升了数据检索的速度,尤其是在处理大规模数据时。然而,不恰当的索引使用可能会适得其反,影响数据库性能。以下是对索引使用技巧的深入...

    74 再来看看几个最常见和最基本的索引使用规则l.pdf

    在本文中,我们将探讨几个最常见和最基本的索引使用规则,特别关注联合索引的使用,这是多列索引的一种,可以帮助进一步优化数据库的查询性能。 首先,我们需要了解等值匹配规则。当我们在WHERE子句中使用等号进行...

    函数索引使用

    ### 函数索引使用 #### 一、函数索引(Function-Based Index)概念与作用 函数索引(Function-Based Index, FBI),是Oracle数据库自Oracle 8i版本引入的一种特殊类型的索引。它允许在创建索引时使用任意内置或...

    索引使用简介.doc

    【索引使用简介】 在数据库管理系统中,索引是一种数据结构,它能够加快对表中数据的访问速度。索引的使用是优化SQL查询性能的关键因素,但也需要谨慎处理,因为它们会对数据插入、更新和删除操作(DML操作)产生...

    表排序 索引使用 使用plist文件存储数据

    在IT行业中,表排序、索引使用以及使用plist文件存储数据是常见的操作,尤其是在数据库管理和移动应用开发中。下面将详细讲解这三个知识点。 首先,**表排序**是数据处理的基础,无论是在关系型数据库中还是在内存...

    SQL Server索引使用的几个误区.pdf

    标题中提到的“SQL Server索引使用的几个误区.pdf”指明了文档的主题是关于SQL Server数据库中索引的使用,同时强调了一些常见错误和误解。这部分内容通常会涉及索引在数据库中的作用、种类以及如何正确使用索引来...

    SQL索引使用方略(系统而全面)

    ### SQL索引使用方略(系统而全面) #### 一、引言 索引是数据库管理系统(DBMS)中用于提高数据检索速度的重要工具之一。它能够显著提升查询性能,但同时也可能对插入、更新和删除操作的速度产生负面影响,并且会占用...

    计算机等考三级数据库辅导:谈索引使用的误区.docx

    【计算机等考三级数据库辅导:谈索引使用的误区】 在数据库设计中,索引是一种重要的优化工具,用于加速数据检索。然而,对于索引的使用,存在一些常见的误区,这可能会导致性能下降而非提升。本文将探讨这些误区,...

    行业-74 再来看看几个最常见和最基本的索引使用规则l.rar

    本资料“行业-74 再来看看几个最常见和最基本的索引使用规则l.rar”可能包含了一份详细的文档,探讨了数据库索引的基本原则和常见应用。下面,我们将深入讲解一些关于索引的重要知识点。 首先,了解索引的工作原理...

    SQL Server 索引结构及其使用(聚集索引与非聚集索引)

    "SQL Server 索引结构及其使用(聚集索引与非聚集索引)" 数据库索引是数据库性能优化的关键技术之一。SQL Server 提供了两种索引:聚集索引(clustered index)和非聚集索引(nonclustered index)。本文将详细介绍...

    计算机等考三级数据库辅导:其他书上没有的索引使用经验总结.docx

    本篇文章将深入探讨一些关于索引使用的经验总结,这些经验可能在传统的教材或书籍中较少提及,但对实际数据库操作有显著的影响。 首先,我们要理解索引的基本概念。索引是数据库管理系统为了加速数据检索而创建的一...

Global site tag (gtag.js) - Google Analytics