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; # 更改日志触发时间
    
posted @ 2019-10-31 20:27  &#127838;面包&#127838;  阅读(109)  评论(0编辑  收藏  举报