二、优化策略
1、分析视图查询计划
使用 `EXPLAIN` 命令检查视图执行计划,识别性能瓶颈:
sql
EXPLAIN SELECT * FROM spider_view WHERE status = 'indexed';
全表扫描:需添加索引。
临时表:可能因复杂子查询导致,需简化视图定义。
2、添加索引
在基础表中为视图常用字段添加索引:
sql
CREATE INDEX idx_spider_status ON spider_table(status);
CREATE INDEX idx_spider_time ON spider_table(access_time);
3、优化视图定义
原始视图(低效):
sql
CREATE VIEW spider_view AS
SELECT *, DATE_FORMAT(access_time, '%Y-%m-%d') AS formatted_date
FROM spider_table
WHERE status IN ('indexed', 'queued');
优化后:
sql
CREATE VIEW spider_view AS
SELECT id, access_time, status
FROM spider_table
WHERE status IN ('indexed', 'queued');
移除不必要的计算字段(如 `formatted_date`)。
4、分拆复杂视图
若视图包含多表关联,拆分为多个视图或使用存储过程:
sql
CREATE VIEW spider_stats AS
SELECT COUNT(*) AS total, AVG(access_time) AS avg_time
FROM spider_table;
5、使用物化视图(MySQL 8.0+)
若需实时性要求不高,可使用物化视图(Materialized View)预计算数据:
sql
CREATE MATERIALIZED VIEW spider_materialized AS
SELECT * FROM spider_table WHERE status = 'indexed';
三、示例:蜘蛛池日志分析视图
基础表结构:
sql
CREATE TABLE spider_log (
id INT AUTO_INCREMENT PRIMARY KEY,
spider_id VARCHAR(50),
access_time DATETIME,
status ENUM('indexed', 'queued', 'failed'),
page_url VARCHAR(255)
);
优化后的视图:
sql
CREATE VIEW spider_daily_stats AS
SELECT
DATE(access_time) AS day,
COUNT(*) AS total_requests,
SUM(CASE WHEN status = 'indexed' THEN 1 ELSE 0 END) AS indexed_pages,
SUM(CASE WHEN status = 'failed' THEN 1 ELSE 0 END) AS failed_pages
FROM spider_log
GROUP BY DATE(access_time);