数据库中的索引种类多样,每种索引都有其特定的用途和特点。以下是常见的索引分类:
1. 单列索引 (Single-Column Index)
对单个列创建的索引。最基本的索引类型。
CREATE INDEX idx_column_name ON table_name (column_name);
2. 多列索引 (Composite Index)
对多个列创建的索引,也称为复合索引或组合索引。适用于多列一起使用的查询。
CREATE INDEX idx_multi_columns ON table_name (column1, column2);
3. 唯一索引 (Unique Index)
确保列中的所有值都是唯一的。唯一索引可以是单列的也可以是多列的。
CREATE UNIQUE INDEX idx_unique_column ON table_name (column_name);
4. 主键索引 (Primary Key Index)
特殊的唯一索引,不允许有空值。每个表只能有一个主键索引。
ALTER TABLE table_name ADD PRIMARY KEY (column_name);
5. 全文索引 (Full-Text Index)
用于快速查找文本数据中的关键词,适用于全文搜索。
CREATE FULLTEXT INDEX idx_fulltext_column ON table_name (column_name);
6. 空间索引 (Spatial Index)
用于地理数据类型的索引,例如 GIS 应用。
CREATE SPATIAL INDEX idx_spatial_column ON table_name (column_name);
7. 聚集索引 (Clustered Index)
表中数据的物理顺序与索引的逻辑顺序一致。每个表只能有一个聚集索引。
CREATE CLUSTERED INDEX idx_clustered_column ON table_name (column_name);
8. 非聚集索引 (Non-Clustered Index)
数据的物理顺序与索引的逻辑顺序不一致。一个表可以有多个非聚集索引。
CREATE INDEX idx_non_clustered_column ON table_name (column_name);
9. 覆盖索引 (Covering Index)
包含所有查询需要的数据列的索引,通过索引就可以满足查询需求,避免访问表数据。
10. 哈希索引 (Hash Index)
使用哈希表实现的索引,适用于精确匹配查询,不适用于范围查询。
索引示例
假设有一个包含用户信息的表 users
:
CREATE TABLE users (user_id INT PRIMARY KEY,username VARCHAR(50) NOT NULL,email VARCHAR(100) NOT NULL UNIQUE,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
我们可以为这个表创建不同类型的索引:
- 单列索引:
CREATE INDEX idx_username ON users (username);
- 多列索引:
CREATE INDEX idx_username_email ON users (username, email);
- 唯一索引:
CREATE UNIQUE INDEX idx_unique_email ON users (email);
- 主键索引:
已经在表定义中创建:
PRIMARY KEY (user_id)
- 全文索引(假设我们有一个
bio
列):
CREATE FULLTEXT INDEX idx_bio ON users (bio);
使用 Java 代码创建索引
在 Java 中可以使用 JDBC 执行 SQL 语句来创建索引。以下是一个示例:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.sql.SQLException;public class CreateIndexExample {public static void main(String[] args) {String url = "jdbc:mysql://localhost:3306/your_database";String user = "your_username";String password = "your_password";String createIndexSQL = "CREATE INDEX idx_username ON users (username)";try (Connection connection = DriverManager.getConnection(url, user, password);Statement statement = connection.createStatement()) {statement.executeUpdate(createIndexSQL);System.out.println("Index created successfully");} catch (SQLException e) {e.printStackTrace();}}
}
通过了解和使用不同类型的索引,可以根据具体的查询需求优化数据库性能。