数据库索引是用于加速数据检索的一种特殊查找表,类似于书籍的参考指南。当在表的列上建立索引时,数据库能够比没有索引的情况下更快地定位行。想象一下,如果没有索引,数据库必须进行全表扫描,逐行检查以确定哪些行满足查询的要求,这可能需要很长时间。而索引使得数据库能够快速找到相关行,从而显著加快这一过程。
索引对于提高SQL查询性能至关重要。在数据库中数据量很大的情况下,如果没有索引,数据库引擎将不得不执行全表扫描,检查每一行以查看哪些行满足查询的要求。这可能需要很长时间。索引允许引擎快速找到相关行,从而大大加快了这一过程。
以下是索引的类型:
复合索引:复合索引包含多个列。它对于基于多个列进行过滤或排序的查询非常有用。
唯一索引:使用唯一索引可以确保索引列中的每个值都是唯一的。这通常用于确保主键列中的值是唯一的。
聚集索引:这种索引修改了表的物理顺序,并执行基于键值的搜索。每个表只能有一个聚集索引。
非聚集索引:非聚集索引保持与数据行不同的结构,并且不会改变表的物理顺序。一个表可以有多个非聚集索引。
在构建表的索引时,SQL查询优化器会自动为特定查询选择适当的索引。这个决定基于多个参数,包括查询结构、表统计信息和索引可用性。由于优化器通常能够确定使用哪个索引最好,这是使用索引最流行和推荐的方法。
在某些情况下,可能希望强制查询优化器使用特定的索引。这在知道某个特定索引对查询更有效,或者认为优化器由于统计信息过时或其他因素而使用错误的索引时非常有用。可以通过使用USE INDEX提示显式指定索引。
CREATE TABLE Employees (
EmployeeID INT PRIMARY KEY,
FirstName VARCHAR(50),
LastName VARCHAR(50),
Gender CHAR(1),
Email VARCHAR(100),
HireDate DATE
);
首先,创建一个表并用示例记录填充它。
INSERT INTO Employees (EmployeeID, FirstName, LastName, Gender, Email, HireDate) VALUES
(1, 'John', 'Doe', 'M', '[email protected]', '2020-01-15'),
(2, 'Jane', 'Smith', 'F', '[email protected]', '2019-07-10'),
(3, 'Alice', 'Johnson', 'F', '[email protected]', '2021-03-22'),
(4, 'Bob', 'Williams', 'M', '[email protected]', '2018-11-30'),
(5, 'Charlie', 'Brown', 'M', '[email protected]', '2022-05-17');
当在SQL数据库中的表上定义主键时,通常会在该主键字段自动创建聚集索引。这表明数据行是根据主键的值物理存储在磁盘上的。
SHOW INDEX FROM Employees;
通过上述命令,可以验证主键和相关索引的存在。
CREATE INDEX idx_lastname ON Employees (LastName);
上述代码将在LastName列上创建一个非聚集索引。
CREATE UNIQUE INDEX idx_unique_email ON Employees (Email);
上述代码将在Email列上创建一个唯一键,并命名为idx_unique_email。
CREATE INDEX idx_composite_name ON Employees (FirstName, LastName);
上述代码使用FirstName和LastName列创建了一个复合键。
以下是使用索引的查询示例:
EXPLAIN SELECT * FROM Employees WHERE LastName = 'Smith';
使用了explain子句来了解查询,可以看到它使用了idx_lastname键。
EXPLAIN SELECT * FROM Employees WHERE FirstName = 'Jane' AND LastName = 'Smith';
上述图像显示它使用了idx_lastname键,但也可以使用方法idx_composite_name。它将自动选择最佳键。
EXPLAIN SELECT * FROM Employees WHERE Email = '[email protected]';
在上述代码中,SQL将使用idx_unique_email进行查询。
以下是删除LastName的非聚集索引的代码。
DROP INDEX idx_lastname ON Employees;
以下是重建Email的唯一索引的代码。
ALTER TABLE Employees DROP INDEX idx_unique_email;
CREATE UNIQUE INDEX idx_unique_email ON Employees (Email);
以下是禁用FirstName和LastName的复合索引的代码。
ALTER TABLE Employees DROP INDEX idx_composite_name;
Q1. 什么是SQL索引? 答:数据库搜索引擎使用SQL索引,这是一种独特的查找表,用于加速数据检索。它使数据库能够比没有索引时更快地定位条目,从而提高查询性能。