首页 > 技术文章 > Pyhton全栈的知识点(6)

Guishuzhe 2018-10-21 14:29 原文

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

 

推荐阅读