二、数据库设计优化
1、表结构设计
sql
用户表
CREATE TABLE `users` (
`id` INT PRIMARY KEY AUTO_INCREMENT,
`username` VARCHAR(50) UNIQUE NOT NULL,
`email` VARCHAR(100) UNIQUE NOT NULL,
`password` VARCHAR(255) NOT NULL,
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
问题表
CREATE TABLE `questions` (
`id` INT PRIMARY KEY AUTO_INCREMENT,
`user_id` INT NOT NULL,
`title` VARCHAR(255) NOT NULL,
`content` TEXT NOT NULL,
`views` INT DEFAULT 0,
`votes` INT DEFAULT 0,
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
`updated_at` TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (`user_id`) REFERENCES `users`(`id`)
);
回答表
CREATE TABLE `answers` (
`id` INT PRIMARY KEY AUTO_INCREMENT,
`question_id` INT NOT NULL,
`user_id` INT NOT NULL,
`content` TEXT NOT NULL,
`votes` INT DEFAULT 0,
`is_accepted` TINYINT(1) DEFAULT 0, 是否被采纳
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (`question_id`) REFERENCES `questions`(`id`),
FOREIGN KEY (`user_id`) REFERENCES `users`(`id`)
);
标签表
CREATE TABLE `tags` (
`id` INT PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(50) UNIQUE NOT NULL
);
问题-标签关联表(多对多)
CREATE TABLE `question_tags` (
`question_id` INT NOT NULL,
`tag_id` INT NOT NULL,
PRIMARY KEY (`question_id`, `tag_id`),
FOREIGN KEY (`question_id`) REFERENCES `questions`(`id`),
FOREIGN KEY (`tag_id`) REFERENCES `tags`(`id`)
);
2、索引优化
问题表:
sql
热点字段索引(快速按用户ID查询问题)
CREATE INDEX idx_user_id ON questions(user_id);
标题模糊查询优化(使用全文索引)
ALTER TABLE questions ADD FULLTEXT idx_title_content(title, content);
回答表:
sql
按问题ID快速获取回答
CREATE INDEX idx_question_id ON answers(question_id);
热回答排序(按点赞数)
CREATE INDEX idx_votes ON answers(votes DESC);
标签关联表:
sql
快速通过标签ID查询问题
CREATE INDEX idx_tag_id ON question_tags(tag_id);
三、查询优化示例
1、高频查询优化
场景:展示热门问题(按点赞数排序):
sql
低效写法(全表扫描)
SELECT * FROM questions ORDER BY votes DESC LIMIT 10;
优化写法(利用索引)
SELECT * FROM questions USE INDEX (idx_votes) ORDER BY votes DESC LIMIT 10;
2、复杂关联查询优化
场景:获取问题及其回答(包含用户信息):
sql
低效写法(多次查询)
SELECT * FROM questions WHERE id = 123;
SELECT * FROM answers WHERE question_id = 123;
SELECT * FROM users WHERE id = question.user_id;
优化写法(JOIN + 索引)
SELECT
q.*,
u.username AS author,
a.id AS answer_id,
a.content AS answer_content,
a.user_id AS answer_author_id
FROM questions q
LEFT JOIN answers a ON q.id = a.question_id
LEFT JOIN users u ON q.user_id = u.id
WHERE q.id = 123;
3、分页查询优化
场景:分页加载问题列表:
sql
低效写法(性能随页码增加下降)
SELECT * FROM questions ORDER BY created_at DESC LIMIT 100000, 10;
优化写法(使用游标分页)
SELECT * FROM questions
WHERE created_at < '某个时间点'
ORDER BY created_at DESC
LIMIT 10;
public static function getConnection() {
if (empty(self::$pool)) {
for ($i = 0; $i < 5; $i++) { // 预创建5个连接
self::$pool[] = new mysqli('localhost', 'user', 'password', 'dbname');
}
}
return array_shift(self::$pool); // 弹出一个连接
}
public static function releaseConnection($conn) {
self::$pool[] = $conn; // 归还连接
}
}
2、高效查询示例
php
// 获取带标签的问题列表
$stmt = $conn-prepare(
SELECT q.*, GROUP_CONCAT(t.name) AS tags
FROM questions q
LEFT JOIN question_tags qt ON q.id = qt.question_id
LEFT JOIN tags t ON qt.tag_id = t.id
GROUP BY q.id
ORDER BY q.votes DESC
LIMIT 10
);
$stmt-execute();
$result = $stmt-get_result()-fetch_all(MYSQLI_ASSOC);
六、性能监控与调优
1、使用 `EXPLAIN` 分析查询:
sql
EXPLAIN SELECT * FROM questions WHERE title LIKE '%优化%';
2、监控工具:
MySQL Workbench:图形化监控和查询分析。
Percona Toolkit:工具集优化慢查询。