1.MySQL数据库
- 引擎:
- innodb
- 支持事务
- 锁
- 行锁
- 表锁
- 示例:
- 终端:
begin; 加锁
select xx from xx for update;
commit; 提交
- pymysql
cursor.execute('select * from xx for update')
- django
with trancation.automic():
models.User.objects.all().for_update()
- mysaim
- 不支持事务
- 锁
- 表锁
- 查询快
2.数据库授权
grant all\select\insert\update\delete|权限 on tables|表名字 to users\public|用户名\\ with grant option|可继承
GRANT <权限>[,<权限>]...[ON <对象类型> <对象名>]TO <用户>[,<用户>]...[WITH GRANT OPTION];
3.了解:https://www.cnblogs.com/wupeiqi/articles/5713323.html
- 视图 (虚拟表)
- 存储过程 (储存语句放在数据库,下次用直接调用)
- 触发器 (自动触发日志,写下记录)
- 函数 (数据库函数)
select max(id) from tb group by xid;
4.索引
索引作用:加速查找+约束。
索引种类:
- 主键索引:加速查找、不重复、非空
- 唯一索引:加速查找、不重复、只能有一个可以为空
- 普通索引:加速查找
- 联合索引:加速查找
- 联合唯一索引:加速查找、不重复
PS:联合索引遵循最左前缀原则。
id name pwd email
命中索引
select * from tb where name='x'
select * from tb where name='x' and pwd='123'
select * from tb where name='x' and pwd='123' and email='xs'
无法命中索引
- like
- 函数
- >
- !=
- group by
- or
名词:
- 覆盖索引:在索引文件中就可以把想要的数据得到,不需要再去物理表中查询
- 视图,虚拟表。放在数据库
- 触发器,在对某张表进行:增、删、改的前后自定义操作。
- 函数,对数据中的值进行操作。
- 索引合并:使用多个单列索引去查找数据。
https://www.cnblogs.com/wupeiqi/articles/5716963.html
5.索引实现原理
- B+ tree 指数增长(使用最多)
- hash 较少使用
6.优化方案:
- 不使用select *
- 短索引
- 使用链表(join)代替子查询
- 固定长度在前面
- 分库分表
- 水平分表
- 垂直分表
- 组合索引 > 索引合并
- 内存代替链表
- Djnago里面ORM字段(choices)
- 查询一条数据时用limit
- 读写分离(主从)
- 分页
- 缓存(热点数据放redis)
注意:char 占用固定长度字节
varchar 占用本身大小字节
- 对于不确定的sql语句先执行 -- explain select * from tb;
- 查询时的访问方式,性能:all < index < range < index_merge < ref_or_null < ref < eq_ref < system/const
7.什么时候需要加锁?
- 计数
- 应用场景:
- 商品数量
8.慢日志?
- 查询时间久
- 未命中索引
修改配置:
slow_query_log = ON/OFF 是否开启慢日志记录
long_query_time = 2 时间限制,超过此时间,则记录
slow_query_log_file = /usr/slow.log 日志文件
log_queries_not_using_indexes = ON/OFF 为使用索引的搜索是否记录
https://blog.csdn.net/jy0902/article/details/19248299 安装redis报错
http://www.cnblogs.com/wupeiqi
1. redis是什么? (做内存管理)
- 配置文件:bind 0.0.0.0 port:6379 require:密码
- 是否可以持久化?AOF(快照)、RDB(记录历史记录)
- 单进程、单线程
- 5大数据类型(字符串,哈希/散列/字典,列表,集合,有序集合)
2.使用连接池
-本质,维护一个已经和服务端链接成功的socket(列表)
-以后再次发送数据时,直接获取一个socket,直接send数据
3.如果redis的key对应的字典中有1000w条数据,请打印所有数据
-hgetall("key") 获取所有数据服务器内存无法承受,爆栈
-hget("key", "v1") 重复操作多,频繁
-hscan_iter("key", count=100) 设置获取数据条目,可行操作
4.redis操作时,只有第一层value支持:list,dict....
5.Django应用:
-自定义使用redis
-使用第三方组件
-全栈缓存
-单视图
-局部页面
补充:rest framework框架访问频率限制推荐放到 redis/memecached