索引 
索引是提高数据库查询性能的重要工具。它们通过创建额外的数据结构来加速数据检索,但同时也需要权衡存储空间和更新性能。
索引类型 
1. 主键索引(Primary Key Index) 
- 唯一标识表中的每一行
- 自动创建
- 不允许NULL值
sql
CREATE TABLE users (
    user_id INT PRIMARY KEY,  -- 自动创建主键索引
    username VARCHAR(50),
    email VARCHAR(100)
);2. 唯一索引(Unique Index) 
- 确保列值的唯一性
- 允许NULL值
- 可以包含多个列
sql
CREATE TABLE products (
    product_id INT PRIMARY KEY,
    product_code VARCHAR(20),
    UNIQUE INDEX idx_product_code (product_code)
);3. 普通索引(Regular Index) 
- 最基本的索引类型
- 不保证唯一性
- 用于加速查询
sql
CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    customer_id INT,
    order_date DATE,
    INDEX idx_customer (customer_id),
    INDEX idx_date (order_date)
);4. 复合索引(Composite Index) 
- 包含多个列的索引
- 列的顺序很重要
- 支持前缀匹配
sql
CREATE TABLE sales (
    sale_id INT PRIMARY KEY,
    product_id INT,
    sale_date DATE,
    amount DECIMAL(10,2),
    INDEX idx_product_date (product_id, sale_date)
);5. 全文索引(Full-Text Index) 
- 用于文本搜索
- 支持模糊匹配
- 适用于大文本字段
sql
CREATE TABLE articles (
    article_id INT PRIMARY KEY,
    title VARCHAR(200),
    content TEXT,
    FULLTEXT INDEX idx_content (content)
);索引实现方式 
1. B-Tree索引 
- 最常用的索引类型
- 支持等值查询和范围查询
- 适用于大多数场景
2. Hash索引 
- 只支持等值查询
- 不支持范围查询
- 查询性能极快
3. R-Tree索引 
- 用于空间数据
- 支持地理信息查询
- 适用于GIS应用
索引优化策略 
1. 选择合适的列 
- 高选择性的列
- 频繁用于查询的列
- 用于排序和分组的列
2. 避免过度索引 
- 每个索引都需要维护成本
- 过多的索引会降低写入性能
- 定期评估索引使用情况
3. 复合索引设计 
- 最左前缀原则
- 考虑查询模式
- 避免冗余索引
sql
-- 好的复合索引设计
CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    customer_id INT,
    status VARCHAR(20),
    order_date DATE,
    INDEX idx_customer_status_date (customer_id, status, order_date)
);
-- 可以支持以下查询
SELECT * FROM orders WHERE customer_id = 1;
SELECT * FROM orders WHERE customer_id = 1 AND status = 'completed';
SELECT * FROM orders WHERE customer_id = 1 AND status = 'completed' AND order_date > '2023-01-01';索引维护 
1. 定期重建索引 
sql
-- MySQL
ALTER TABLE table_name ENGINE=InnoDB;
-- PostgreSQL
REINDEX TABLE table_name;2. 监控索引使用 
sql
-- MySQL
EXPLAIN SELECT * FROM table_name WHERE column = value;
-- PostgreSQL
EXPLAIN ANALYZE SELECT * FROM table_name WHERE column = value;3. 删除无用索引 
sql
DROP INDEX index_name ON table_name;常见问题与解决方案 
1. 索引失效 
- 使用函数或运算符
- 类型转换
- 使用OR条件
2. 索引选择 
- 考虑查询频率
- 考虑数据分布
- 考虑更新频率
3. 性能优化 
- 使用覆盖索引
- 避免索引列上的计算
- 合理使用索引提示
最佳实践 
- 索引设计原则 - 为常用查询创建索引
- 保持索引简洁
- 定期维护索引
 
- 监控与调优 - 监控索引使用情况
- 分析慢查询
- 定期优化索引
 
- 文档维护 - 记录索引设计决策
- 说明索引用途
- 更新索引变更记录