读写分离,主从,master-slave
- master机器只用来写入
- slave机器只能用来读取
- 读写分离的问题:数据同步的问题,master机器会把新写入数据的同步到slave机器上,毫秒级别
django配置如下
代码语言:javascript复制DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
},
'db2': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db2.sqlite3'),
},
}
手动进行读写分离的orm操作
代码语言:javascript复制def write(request):
models.Products.objects.using('default').create(prod_name='熊猫公仔', prod_price=12.99)
return HttpResponse('写入成功')
def read(request):
obj = models.Products.objects.filter(id=1).using('db2').first()
return HttpResponse(obj.prod_name)
mysql binlog的作用
- binlog日志用于记录所有更新了数据或者已经潜在更新了数据(例如,没有匹配任何行的一个DELETE)的所有语句。语句以“事件”的形式保存,它描述数据更改。
mysql 慢查询日志
代码语言:javascript复制# 慢查询日志存放路径
log slow queries = /data/mysqldata/slowquery.log
# 多慢才叫慢查询的定义
long_query_time = 2
mysql explain语句
代码语言:javascript复制explain select * from s_books;
代码语言:javascript复制 ---- ------------- --------- ------------ ------ --------------- ------ --------- ------ ------ ---------- -------
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
---- ------------- --------- ------------ ------ --------------- ------ --------- ------ ------ ---------- -------
| 1 | SIMPLE | s_books | NULL | ALL | NULL | NULL | NULL | NULL | 2 | 100.00 | NULL |
---- ------------- --------- ------------ ------ --------------- ------ --------- ------ ------ ---------- -------
1 row in set, 1 warning (0.01 sec)
不能漫无目的的建索引(create index)
- 因为索引建的多了以后,同样会带来性能问题,因为每多一个索引,都会增加写操作的开销和磁盘空间的开销。
- 有针对性的建索引,通过explain和查看慢查询日志,来找出性能的瓶颈
django程序如何进行优化
- 缓存策略,redis
- 耗时任务异步化,celery
- 优化orm查询,优化queryset查询
- 静态资源存到cdn(阿里云图片云存储,七牛云,又拍云)
- 负载均衡
几个链接
- MySQL慢查询&分析SQL执行效率浅谈
- MYSQL性能优化的最佳20 条经验
- 我必须得告诉大家的 MySQL 优化原理
- MySQL 备份和恢复机制
- ACID 原理
mysql建索引
- CREATE INDEX indexName ON mytable(username(length));
- ALTER table tableName ADD INDEX indexName(columnName)
mysql复合索引,针对多个字段一起建索引
- CREATE INDEX idx_example ON table1 (col1 ASC, col2 DESC, col3 ASC)