索引的使用

A. 使用简单索引
下面的示例为 authors 表的 au_id 列创建索引。

SET NOCOUNT OFF
USE pubs
IF EXISTS (SELECT name FROM sysindexes
     
WHERE name = 'au_id_ind')
  
DROP INDEX authors.au_id_ind
GO
USE pubs
CREATE INDEX au_id_ind
  
ON authors (au_id)
GO

B. 使用唯一聚集索引
下面的示例为 emp_pay 表的 employeeID 列创建索引,并且强制唯一性。因为指定了
CLUSTERED 子句,所以该索引将对磁盘上的数据进行物理排序。

SET NOCOUNT ON
USE pubs
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES
     
WHERE TABLE_NAME = 'emp_pay')
  
DROP TABLE emp_pay
GO
USE pubs
IF EXISTS (SELECT name FROM sysindexes
     
WHERE name = 'employeeID_ind')
  
DROP INDEX emp_pay.employeeID_ind
GO
USE pubs
GO
CREATE TABLE emp_pay
(
employeeID
int NOT NULL,
base_pay
money NOT NULL,
commission
decimal(2, 2) NOT NULL
)
INSERT emp_pay
  
VALUES (1, 500, .10)
INSERT emp_pay
  
VALUES (2, 1000, .05)
INSERT emp_pay
  
VALUES (3, 800, .07)
INSERT emp_pay
  
VALUES (5, 1500, .03)
INSERT emp_pay
  
VALUES (9, 750, .06)
GO
SET NOCOUNT OFF
CREATE UNIQUE CLUSTERED INDEX employeeID_ind
  
ON emp_pay (employeeID)
GO C. 使用简单组合索引下面的示例为 order_emp 表的 orderID 列和 employeeID 列创建索引。 SET NOCOUNT ON
USE pubs
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES
     
WHERE TABLE_NAME = 'order_emp')
  
DROP TABLE order_emp
GO
USE pubs
IF EXISTS (SELECT name FROM sysindexes
     
WHERE name = 'emp_order_ind')
  
DROP INDEX order_emp.emp_order_ind
GO
USE pubs
GO
CREATE TABLE order_emp
(
orderID
int IDENTITY(1000, 1),
employeeID
int NOT NULL,
orderdate
datetime NOT NULL DEFAULT GETDATE(),
orderamount
money NOT NULL
)

INSERT order_emp (employeeID, orderdate, orderamount)
  
VALUES (5, '4/12/98', 315.19)
INSERT order_emp (employeeID, orderdate, orderamount)
  
VALUES (5, '5/30/98', 1929.04)
INSERT order_emp (employeeID, orderdate, orderamount)
  
VALUES (1, '1/03/98', 2039.82)
INSERT order_emp (employeeID, orderdate, orderamount)
  
VALUES (1, '1/22/98', 445.29)
INSERT order_emp (employeeID, orderdate, orderamount)
  
VALUES (4, '4/05/98', 689.39)
INSERT order_emp (employeeID, orderdate, orderamount)
  
VALUES (7, '3/21/98', 1598.23)
INSERT order_emp (employeeID, orderdate, orderamount)
  
VALUES (7, '3/21/98', 445.77)
INSERT order_emp (employeeID, orderdate, orderamount)
  
VALUES (7, '3/22/98', 2178.98)
GO
SET NOCOUNT OFF
CREATE INDEX emp_order_ind
  
ON order_emp (orderID, employeeID)

D. 使用
FILLFACTOR 选项
下面的示例使用
FILLFACTOR 子句,将其设置为 100FILLFACTOR100 将完全填满每一页,只有确定表中的索引值永远不会更改时,该选项才有用。

SET NOCOUNT OFF
USE pubs
IF EXISTS (SELECT name FROM sysindexes
     
WHERE name = 'zip_ind')
  
DROP INDEX authors.zip_ind
GO
USE pubs
GO
CREATE NONCLUSTERED INDEX zip_ind
  
ON authors (zip)
  
WITH FILLFACTOR = 100

E. 使用 IGNORE_DUP_KEY
下面的示例为 emp_pay 表创建唯一聚集索引。如果输入了重复的键,将忽略该
INSERTUPDATE 语句。

SET NOCOUNT ON
USE pubs
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES
     
WHERE TABLE_NAME = 'emp_pay')
  
DROP TABLE emp_pay
GO
USE pubs
IF EXISTS (SELECT name FROM sysindexes
     
WHERE name = 'employeeID_ind')
  
DROP INDEX emp_pay.employeeID_ind
GO
USE pubs
GO
CREATE TABLE emp_pay
(
employeeID
int NOT NULL,
base_pay
money NOT NULL,
commission
decimal(2, 2) NOT NULL
)
INSERT emp_pay
  
VALUES (1, 500, .10)
INSERT emp_pay
  
VALUES (2, 1000, .05)
INSERT emp_pay
  
VALUES (3, 800, .07)
INSERT emp_pay
  
VALUES (5, 1500, .03)
INSERT emp_pay
  
VALUES (9, 750, .06)
GO
SET NOCOUNT OFF
GO
CREATE UNIQUE CLUSTERED INDEX employeeID_ind
  
ON emp_pay(employeeID)
  
WITH IGNORE_DUP_KEY

F. 使用 PAD_INDEX 创建索引
下面的示例为 authors 表中的作者标识号创建索引。没有 PAD_INDEX 子句,SQL Server 将创建填充
10% 的叶级页,但是叶级之上的页几乎被完全填满。使用 PAD_INDEX 时,中间级页也填满 10%



说明  如果没有指定 PAD_INDEX,唯一聚集索引的索引页上至少会出现两项。


SET NOCOUNT OFF
USE pubs
IF EXISTS (SELECT name FROM sysindexes
     
WHERE name = 'au_id_ind')
  
DROP INDEX authors.au_id_ind
GO
USE pubs
CREATE INDEX au_id_ind
  
ON authors (au_id)
  
WITH PAD_INDEX, FILLFACTOR = 10

G. 为视图创建索引
下面的示例将创建一个视图,并为该视图创建索引。然后,引入两个使用该索引视图的查询。

USE Northwind
GO

--Set the options to support indexed views.
SET NUMERIC_ROUNDABORT OFF
GO
SET ANSI_PADDING,ANSI_WARNINGS,CONCAT_NULL_YIELDS_NULL,ARITHABORT,QUOTED_IDENTIFIER,ANSI_NULLS ON
GO

--Create view.
CREATE   VIEW V1
WITH   SCHEMABINDING
AS
  
SELECT SUM(UnitPrice*Quantity*(1.00-Discount)) AS Revenue, OrderDate, ProductID, COUNT_BIG(*) AS COUNT
  
FROM   dbo.[Order Details] od, dbo.Orders o
  
WHERE   od.OrderID=o.OrderID
  
GROUP BY   OrderDate, ProductID
GO

--Create index on the view.
CREATE UNIQUE CLUSTERED INDEX IV1 ON V1 (OrderDate, ProductID)
GO

--This query will use the above indexed view.
SELECT SUM(UnitPrice*Quantity*(1.00-Discount)) AS Rev, OrderDate, ProductID
FROM   dbo.[Order Details] od, dbo.Orders o
WHERE   od.OrderID=o.OrderID AND ProductID in (2, 4, 25, 13, 7, 89, 22, 34)
  
AND OrderDate >= '05/01/1998'
GROUP BY OrderDate, ProductID
ORDER BY Rev DESC

--This query will use the above indexed view.
SELECT  OrderDate, SUM(UnitPrice*Quantity*(1.00-Discount)) AS Rev
FROM   dbo.[Order Details] od, dbo.Orders o
WHERE   od.OrderID=o.OrderID AND DATEPART(mm,OrderDate)= 3
  
AND DATEPART(yy,OrderDate) = 1998
GROUP BY OrderDate
ORDER BY OrderDate ASC


本文来自CSDN博客,转载请标明出处:http:
//blog.csdn.net/fredrickhu/archive/2009/10/18/4693918.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL索引是一种数据结构,用于提高数据库查询的效率。使用索引可以快速定位到特定的数据行,而不必扫描整个数据表。下面是关于 MySQL 索引使用的一些常见问题和注意事项: 1. 什么是索引索引是按照一定的规则对表中的数据进行排序和组织的数据结构,以加快对数据的检索速度。它类似于书籍的目录,可以根据关键字快速找到所需的内容。 2. 如何创建索引? 在创建表时,可以指定某些列作为索引列。可以使用 CREATE INDEX 或 ALTER TABLE 命令来创建索引,也可以在创建表时使用 PRIMARY KEY 或 UNIQUE 约束来自动创建索引。 3. 为什么要使用索引使用索引可以大大提高查询的速度,尤其是在数据量较大时。它可以减少数据库查询操作需要扫描的数据量,从而缩短查询的响应时间。 4. 索引的类型有哪些? MySQL 支持多种类型的索引,包括主键索引、唯一索引、普通索引、全文索引等。每种类型的索引都有自己的应用场景和使用注意事项。 5. 如何选择合适的列创建索引? 通常情况下,选择经常被查询条件使用的列或者经常用于连接的列来创建索引是比较有效的。但是过多的索引也会增加数据更新的开销,因此需要根据实际情况进行权衡和选择。 6. 索引的优缺点是什么? 索引可以提高查询性能,但同时也会增加数据库的存储空间和维护成本。过多或不合理的索引可能导致查询性能下降、数据更新变慢等问题。因此,在创建索引时需要谨慎考虑。 这是一些关于 MySQL 索引使用的基本信息,如果你有具体的问题或者需要更详细的讨论,请提供更多上下文。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值