day 36
day 36 pymysql
01.pymysql用python操作mysql
- 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
- 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执行
- pass
02.索引
- 使用索引为了提高查询效率
- 底层用的是B+树
- 索引的本质是一个特殊的文件
- 索引的种类
# 主键索引;加速查找,不能重复,不能为空
primary key
# 唯一索引;加速查找,不能重复,
unique(字段)
# 联合唯一索引
unique(字段1,字段2)
# 普通索引
index(字段)
# 联合普通索引
index(字段1,字段2)
- 索引的创建和删除
## 主键索引
# 新增主键索引
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 索引名;
-
索引的优缺点
- 通过观察*.ibd文件可知
- 索引加快了查询数据的速度
- 但加了索引之后,会大量的占用磁盘空间
- 通过观察*.ibd文件可知
-
不会命中索引的情况
-
范围获取,条件不明确< > != >= <= between and like
-
sql语句中使用了四则运算
-
不能在sql语句中使用函数
-
数据类型不一致字符串必须加引号
-
order by 排序对象未添加索引
-
查询总个数时使用count(*)
-
组合索引最左前缀
- 根据业务场景,在最常用的几列上添加
select * from user where name = 'xxx' and email = 'xxx.com' index ix_name_email(name,email) # 创建组合索引,提升此种情况的查询效率 where name and email # 命中索引 where name # 命中索引 where email # 未命中索引
-
-
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)
-
索引覆盖
select id from xxx where id=ddd
# 通过索引值获取索引值,拿着答案找答案
- pass
03.慢查询日志
-
查询时间超过 X秒 称之为慢sql
-
查看慢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秒
-
配置慢sql的变量
set global 变量名 = 值; set global slow_query_log = on; # 开启慢sql日志记录 set global slow_query_log_file = '文件路径'; # 没有会自动创建 set global long_query_time = x; # 更改日志触发时间