• day 36


    day 36 pymysql

    01.pymysql用python操作mysql

    1. pymysql连接到mysql
    import pymysql
    信息1 = input().strip()
    信息2 = input().strip()
    conn = pymysql.connect(host='localhost',user='用户名',password='密码',database='要使用的数据库名',charset='utf8') # localhost连接到本地主机
    cursor = conn.cursor(cursor = pymysql.cursors.DictCursor) # 将返回值设定为字典类型,默认元组
    sql1 = "select * from 表名 where 字段1 = %s and 字段2 = %s" # 获取数据
    sql2 = "insert into 表名 (字段1,字段2) values(%s,%s)" # 添加信息
    sql3 = "update 表名 set 字段1 = %s where 字段2=%s" # 修改数据
    sql4 = "delete from 表名 where 字段1=%s and 字段2=%s" # 删除数据行
    sql = "正常在cmd中使用的sql语句都可以"
    cursor.execute(sql,(信息1,信息2)) # 对传入的信息进行合法化处理,并传给%s,让sql执行
    res = cursor.fetchmany(12) # 限制取出多少条数据,以列表套字典的形式返回
    conn.commit() # 对数据修改必须加上
    cursor.close() # 关闭对数据库的操作
    conn.close() # 关闭与数据库的连接
    
    res = cursor.fetchall() # 接收全部数据,列表套字典
    res = cursor.fetchone() # 接收一条数据,字典形式
    res = cursor.fetchmany(X) # 接收X条数据,列表套字典
    
    data = []
    for i in range(xxxxx):
        info = (处理)
        data.append(info)
    cursor.executemany(sql,data) # 执行多次sql
    
    1. sql注入
    # 出现原因为没有对用户输入进行合法化校验
    select * from 表名 where 条件1 and 条件2;
    条件1值 = 值1 ' or 1=1 #
    条件2值 = 任意输入
    select * from 表名 where 字段1=值1 or 1=1 # and 条件2
    导致执行的sql语句变为这样,将where后面的条件无效化了
    
    # 通过这种方式校验后可以避免注入事件的发生
    cursor.execute(sql,(信息1,信息2)) # 对传入的信息进行合法化处理,并传给%s,让sql执行
    
    1. pass

    02.索引

    1. 使用索引为了提高查询效率
      1. 底层用的是B+树
      2. 索引的本质是一个特殊的文件
    2. 索引的种类
    # 主键索引;加速查找,不能重复,不能为空
    primary key
    # 唯一索引;加速查找,不能重复,
    unique(字段)
    # 联合唯一索引
    unique(字段1,字段2)
    # 普通索引
    index(字段)
    # 联合普通索引
    index(字段1,字段2)
    
    1. 索引的创建和删除
    ## 主键索引
    # 新增主键索引
    create table 表名(
    id int auto_increment primary key
    )charset utf8;
    
    create table 表名(
    字段1 int auto——increment,
    primary key(字段1)
    )charset utf8;
    
    # 追加主键索引
    alter table 表名 change 字段1 字段1 int auto_increment primary key;
    alter table 表名 add primary key(字段1);
    
    # 删除主键索引
    alter table 表名 drop primary key;
    
    ## 唯一索引
    # 创建唯一索引
    create table 表名(
    id int auto_increment primary key,
    字段1 varchar(32) not null default '',
    unique 索引名 (字段1) # 给字段1创建索引
    )charset utf8;
    
    # 追加唯一索引
    create unique index 索引名 on 表名(字段名);
    
    alter table 表名 add unique index 索引名 (字段名);
    
    # 删除唯一索引
    alter table 表名 drop index 索引名;
    
    ## 普通索引
    # 创建普通索引
    create table 表名(
    id int auto_increment primary key,
    字段1 类型 限制,
    index 索引名(字段1)
    )charset utf8;
    # 追加普通索引
    create index 索引名 on 表名(字段名);
    alter table 表名 add index 索引名(字段名);
    # 删除索引
    alter table 表名 drop index 索引名;
    
    1. 索引的优缺点

      1. 通过观察*.ibd文件可知
        1. 索引加快了查询数据的速度
        2. 但加了索引之后,会大量的占用磁盘空间
    2. 不会命中索引的情况

      1. 范围获取,条件不明确< > != >= <= between and like

      2. sql语句中使用了四则运算

      3. 不能在sql语句中使用函数

      4. 数据类型不一致字符串必须加引号

      5. order by 排序对象未添加索引

      6. 查询总个数时使用count(*)

      7. 组合索引最左前缀

        1. 根据业务场景,在最常用的几列上添加
        select * from user where name = 'xxx' and email = 'xxx.com'
        index ix_name_email(name,email) # 创建组合索引,提升此种情况的查询效率
        where name and email # 命中索引
        where name # 命中索引
        where email # 未命中索引
        
    3. explain 检查sql语句是否命中索引

      explain select * from 表名 where 条件/G # 通过explain来查看这条sql指令会触发那些情况
      *************************** 1. row ***************************
                 id: 1
        select_type: SIMPLE
              table: student
         partitions: NULL
               type: ref									# 索引指向 all表示搜索全表
      possible_keys: fk_st_cl,name_cid		# 列出可能会用到的索引
                key: name_cid							# 实际用到的索引
            key_len: 10										# 这个索引的长度
                ref: const,const
               rows: 1										# 扫描长度,扫描了几个数据
           filtered: 100.00
              Extra: NULL									# 触发索引获取得值,Using where表式通过where条件获取
      1 row in set, 1 warning (0.00 sec)
      
    4. 索引覆盖

    select id from xxx where id=ddd
    # 通过索引值获取索引值,拿着答案找答案
    
    1. pass

    03.慢查询日志

    1. 查询时间超过 X秒 称之为慢sql

    2. 查看慢sql的相关变量

      mysql> show variables like '%slow%'; # 通过模糊查找在变量中查找
      +---------------------------+-------------------------------------------------------+
      | Variable_name             | Value                                                 |
      +---------------------------+-------------------------------------------------------+
      | log_slow_admin_statements | OFF                                                   |
      | log_slow_extra            | OFF                                                   |
      | log_slow_slave_statements | OFF                                                   |
      | slow_launch_time          | 2                                                     |
      | slow_query_log            | OFF    # OFF 表示慢查询日志处于关闭状态,改成on开启         |
      | slow_query_log_file       | /usr/local/mysql/data/luocongyudeMacBook-Pro-slow.log |
      +---------------------------+-------------------------------------------------------+
      6 rows in set (0.01 sec)
      /usr/local/mysql/data/luocongyudeMacBook-Pro-slow.log # 为日志存放位置
      mysql> show variables like '%long%';
      +----------------------------------------------------------+-----------+
      | Variable_name                                            | Value     |
      +----------------------------------------------------------+-----------+
      | long_query_time                                          | 10.000000 | # 默认时间为10秒
      
      
    3. 配置慢sql的变量

      set global 变量名 = 值;
      set global slow_query_log = on; # 开启慢sql日志记录
      set global slow_query_log_file = '文件路径'; # 没有会自动创建
      set global long_query_time = x; # 更改日志触发时间
      
  • 相关阅读:
    Harbor-企业级Registry服务器安装配置和使用(图解)
    kubernetes(k8s)kubectl使用详解
    prometheus和zabbix的对比
    kubernetes学习:CKA考试题
    k8s网络之Flannel网络
    k8s网络主题系列:Flannel和Calico
    kubernetes基础概念
    CoreDNS系列1:Kubernetes内部域名解析原理、弊端及优化方式
    解析记录格式
    五月七号日报
  • 原文地址:https://www.cnblogs.com/luocongyu/p/11773545.html
Copyright © 2020-2023  润新知