9. SQL—索引
Posted 江湖@小小白
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了9. SQL—索引相关的知识,希望对你有一定的参考价值。
1. 使用索引
使用索引是另外一种让数据提供给用户的形式与它在数据库中不同的方法,
此外,索引可以让存储于磁盘上的数据进行重新排序,这是一些视图不具有的功能。
在 SQL 中使用索引是其于以下几个原因:
- 提高查询的执行速度。
- 可以容易地用索引字段或其它字段进行排序。
- 在使用 UNIQUE 关键字时强制性地保证数据的完整性。
2. 什么是索引?
在数据库中使用索引可以让 SQL 使用直接访问方式。
SQL 采用树形结构来存储和返回索引数据,用以指示的数据存储在树的最末端,也就是叶子,它们被称为结点。也可以叫叶子,每一个结点中有一个指向其它结点的指针,结点左边的值只是它的双亲结点,结点右边的值则是孩子结点或叶子。
索引基本语法:
CREATE INDEX
index_name
ON
table_name
(
column_name1,
[column_name2], ...
);
使用索引不会对表中的物理存储造成影响.
3. 使用索引的技巧
1.对于小标来说,使用索引对于性能不会有任何提高.
2.当你的索引中有极多的不同的数据和空值时,
索引会使性能有极大的提高.
3.当查询要返回的数据很少时索引可以优化你的查询
(比较好的情况是少于全部的数据的25%).
如果你要返回的数据很多时索引会加大系统开销.
4.索引可以提高数据的返回速度,但是它使得数据的更新操作变慢,
在对记录和索引进行更新时请不要忘记这一点。
如果要进行大量的更新操作,在你执行更新操作时请不要忘记先删除索引,
当你执行完更新操作后,只需要简单的恢复索引即可。
对于一次特定的操作,系统可以保存删除的索引 18 个小时,
在这个时间内数据更新操作完后你可以恢复它。
5.索引会占用你的数据库的空间,
如果你的数据库管理系统允许你管理数据库的磁盘空间。
那么在设计数据库的可用空间时要考虑索引所占用的空间。
6.对字段的索引已经对两个表进行了归并操作,
这一技术可以极大地提高归并的速度。
7.大多是数据库系统不允许你对视图创建索引,
如果你的数据库系统 允许你这么做,
那么可以使用这种方法来在 SELECT 语句中对视图的数据进行排序
(一些数据库系统中也不允许在视图中使用 ORDER BY 子句)。
8.不要创建对经常需要更新或修改的字段创建索引,
更新索引的开销会降低你所期望获得的性能。
9.不要将索引与表存储在同一个驱动器上,
分开存储会去掉访问的冲突从而使结果返回得更快。
4. 对更多的字段进行索引
SQL 允许对多个字段进行索引,这种索引被称为复合索引。
CREATE INDEX ID_CMPD_INDEX
ON BILLS
(
ACCOUNT_ID,
AMOUNT
);
注:
1.虽然是对两个字段进行索引,
但索引在物理结构上只有一个.
2.选择唯一值最多的列建立索引可以达到你所希望的性能.
分析:
当使用复合索引时,
要把最可能选择的字段放在前边,
也就是说,
把你最经常在查询中使用是字段放在最前边,
在 CREATE INDEX 中列的出现次序不必与表中的次序一致.
eg:
如果经常使用下面的查询sql:
SELECT * FROM
BILLS
WHERE
NAME = "Cable TV Company";
为了想达到所期望的性能,
你必须在索引中将 NAME 字段放在第一位.
CREATE INDEX NAME_INDEX
ON BILLS
(
NAME, AMOUNT
);
或者
CREATE INDEX
NAME_INDEX
ON
BILLS(NAME);
在这两个例子中 NAME 都在索引字段的最左边,
所以这两个索引可以提高对 NAME 的查询的性能.
注:
一个索引可以包含多个列通常是指复合索引,
复合索引的性能与单个字段的索引相比是无法断定的,
以 ORACLE 为例,
如果你在查询条件中经常指定某一特定的列,
那么你可以创建这个列的索引,
而当你的查询需要复合条件时你可以创建复合索引,
当创建多个索引的时候,
你需要参考你所选定的解释器的帮助信息以从中得到确定的复合索引的用法.
5. 在创建索引时使用 UNIQUE 关键字
复合索引通常使用 UNIQUE 关键字来防止有相同数据的多个记录多次出现。
create unique index
unique_id_name
on
BILLS(ACCOUNT_ID, NAME);
CREATE INDEX
DESC_AMOUNT
ON
BILLS(AMOUNT DESC);
6. 索引与归并
当在查询中使用了复杂的归并时,你的 SELECT 语句会耗用很长的时间,对于大表来说,所用的时间可能会达到好几秒钟(与你通常需要等待几毫秒相对比) ,这样的性能在客户机/服务器环境中常会令你的用户对使用你的应用程序感到不耐烦,在归并时对字段创建索引可以显著地提高你的查询反映速度,但是,如果你创建太多的索引,就会使你的系统的性能下降而不是提高 。
注:大多数的解释器有捕获查询耗用时间的机制,ORACLE 将这种特性称为 timing
eg:
对 BILS 表与 BANK_ACCOUNT 表根据 ACCOUNT_ID 字段创建了索引
CREATE INDEX
BILLS_INDEX
ON BILLS(ACCOUNT_ID);
CREATE INDEX
BILLS_INDEX2
ON BANK_ACCOUNTS(ACCOUNT_ID);
SELECT
BILLS.NAME NAME,
BILLS.AMOUNT AMOUNT,
BANK_ACCOUNTS.BALANCE ACCOUNT_BALANCE
FROM
BILLS,
BANK_ACCOUNTS
WHERE
BILLS.ACCOUNT_ID = BANK_ACCOUNTS.ACCOUNT_ID;
分析:
这个例子中首次在相关的表中为 ACCOUNT_ID 字段创建了索引,
在每一个表中均对 ACCOUNT_ID 字段创建了索引以后,
归并就可以更快地访问特定行的数据,
作为一个规则,
你应该对表中的唯一属性的字段或你用以归并操作的字段来创建索引.
7. 群集(簇)的使用
在许多数据管理系统中都支持一种特殊的,可以允许数据库管理员或开发人员对数据进行群集的索引,当使用群集索引时,数据在表中的物理排列方式将会被修改,使用群集索引通常比传统的不使用群集的索引速度要快,但是,许多数据库管理系统,如(Sybase 的 SQL Server) 只允许一个表有一个群集索引,用于创建群集索引的字段常常是主关键字。
用 Sybase 的 Transact-SQL 你可以对 BANK_ACCOUNT 的
ACCOUNT_ID 字段创建一个群集的,不重复的索引:
语法如下:
create unique clustered index id_index
on BANK_ACCOUNTS(ACCOUNT_ID);
ORACLE 中群集的概念与此不同,
当使用 ORACLE 关系数据库系统时,
群集就是一个像数据或表一样的对象,
群集一般是存储了表的共有字段以提高对表的访问速度.
总结
-
视图是一种虚表,视图是提供给用户的数据与其在数据库的真实面貌不相同的一种方法,CREATE VIEW 语法的语法使用了标准的 SELECT 语法来创建了一个视图,除了一些小差别,你可以将视图视为一个常规的表来执行插入、删除、更新和选择操作。
-
基本的创建视图的语法如下:
CREATE VIEW view_name AS SELECT field_name(s) FROM table_name(s);
-
视图主要用于以下方面:
-
提高用户数据的安全性
-
进行单位换算
-
创建一个新格式的虚表
-
使复杂查询的构筑简单化
-
-
创建索引的基本语法:
CREATE INDEX index_name ON table_name (field_name(s));
以上是关于9. SQL—索引的主要内容,如果未能解决你的问题,请参考以下文章