前言
生产上数据库优化是非常有必要的,优化后能快速提升用户体验、保障系统稳定性、降低成本。
关注点
- 数据库调优的目标是什么?
- 如果进行调优有哪些维度可以进行选择?
- 如何思考和分析数据库调优这件事?
调优目标
使得数据库运行更快,响应时间更短,吞吐量更大。
调优目标应当是变化的不能单纯的从更快来进行定义,例如在双十一会带来大规模的并发访问问题。
如何确定调优目标?
- 用户反馈
- 日志分析
- 服务器资源使用监控
- 数据库内部状况监控
调优维度(优化手段)
1、选择适合的DBMS
mysql、mongodb、hbase。
2、优化表设计
第三范式、反范式设计、选择合适的数据类型。
3、优化逻辑查询
sql语句使用优化。
4、优化物理查询
建立索引。
5、使用redis缓存
6、库级优化
主从架构、读写分离、垂直切分、水平切分。
7、写优化
以mongodb为例:
7-1连接数 maxPoolSize 调优;
import mongoose from 'mongoose';
const dbAddress = `mongodb://${DB_USERNAME}:${DB_PASSWORD}@${DB_HOST}/
${DB_DATABASE}?replicaSet=${replicaSet}&authSource=admin`;
mongoose.connect(
"",
{
// @ts-ignore
useNewUrlParser: true,
useUnifiedTopology: true,
maxPoolSize: 50
},
function(err) {
if (err) {
console.log(err, 'mongodb连接失败。')
reject(err)
} else {
console.log('mongodb连接成功。')
resolve(true)
}
}
)
7-2单个写入改为批量写入;
import mongoose from 'mongoose';
const studentSchema = new mongoose.Schema(
{
dataId: mongoose.SchemaTypes.ObjectId,
name: String,
age: String
},
{ strict: false });
const studentModel = mongoose.model('student', studentSchema);
const data = [{'name': 'jack', 'age': '16'}];
const options = {};
studentModel.insertMany(data, options);
7-3写入参数调优。
import mongoose from 'mongoose';
const data = [{'name': 'jack', 'age': '16'}];
// 不排序、不校验
const options = {ordered: false, lean: true, bypass_document_validation: true};
studentModel.insertMany(data, options);