目录
pymysql
介绍
python操作mysql的模块
安装
pip install pymysql
连接
import conn = pymysql conn = pymysql.connect(host= 主机名,user = 用户名, password = 密码,database = 数据库名) cursor = conn.cursor() // 返回的是元组中套元组 cursor = conn.cursor(cursor=pymysql.cursors.dictcursor) // 返回的是列表中套字典
执行
执行sql语句
cursor.execupt(sql)
查
fetchcall() :获取多个,返回 列表套字典
fetchone() :获取一个,返回 字典
fetchmany(size) :获取指定数量,返回 列表套字典
增删改
sql='' cursor.execute(sql,(1,2,3)) // 添加1个 cursor.executemany(sql,[(1,2,3),(1,2,3)]) // 添加多个 conn.commit() //必须加commit()
sql注入
原因
太相信用户输入的数据
解决的方式
cursor.execute(sql,(user,pwd))
csrf攻击
索引
索引的作用
提高查询的效率
类比:字典中的目录
字典的目录,先查询到章,再到小结
底层采用的数据结构
B+树
索引本质
本质上就是一个特殊的文件,只不过这个特殊的文件底层的数据结构是B+树
索引的分类
主键索引
作用
加快查询速度 + 不能重复 + 不能为空
增加
第一种方法: (************************) create table user( id int auto_increment primary key//每表必有主键自增id ) 注意: auto_increment依赖 primary key,只删除主键不行 第二种方法: alter table 表名 add change 段名 段名 int auto_increment primary key;
删除
首先要删除auto_increment自增,否则主键删除不掉 alter table 表名 add change 段名 段名 int primary key; 然后再删除 alter table 表名 drop primary key;
场景
一般都是加在 id 这一列 技术是服务于业务的
唯一索引
作用
加快查询速度 + 不能重复
增加
第一种方法 create table user ( id int auto_increment primary key, phone in not null default 0, unique 索引名ix_ph (字段名phone) ) 第二种方法 alter table 表名 unique index 索引名(字段名); 第三种方法 create unique index 索引名 on user (字段名);
删除索引
alter table 表名 drop index 索引名;
场景
应用在唯一值的时候,根据自己的业务确定
联合唯一索引
作用
加快查询速度 + 不能重复 insert into (a,b) values (1,2) // insert into (a,b) values (1,2) 联合添加相同的值不能添加 // insert into (a,b) values (1,3) 添加一个相同的可以
增加
第一种方法 create table user ( id int auto_increment primary key, phone in not null default 0, unique 索引名ix_ph (字段名phone,字段名name) )charset utf8; 第二种方法 alter table 表名 unique index 索引名(字段名,字段名); 第三种方法 create unique index 索引名 on user (字段名,字段名);
删除索引
alter table 表名 drop index 索引名;
场景
根据项目或者业务方的需求,灵活的加上联合唯一索引
普通索引
作用
加速查找
增加
第一种方法 create table user ( id int auto_increment primary key, phone in not null default 0, index 索引名(字段名) ) 第二种方法 alter table 表名 add index 索引名 (字段名); 第三种方法 create index 索引名 on 表名(字段名);
删除
alter table 表名 drop index 索引名;
联合(组合)索引
index (name,age) 加快查询速度,可以重复
什么时候会创建联合索引?
根据公司的业务场景, 在最常用的几列上添加索引 select * from user where name='zekai' and email='zekai@qq.com'; 果遇到上述业务情况, 错误的做法: index ix_name (name), index ix_email(email) 正确的做法: index ix_name_email(name, email)
索引命中
索引并不是加的越多越好.
explain
explain 来分析索引命中与否 + \G 格式化输出信息
不会命中索引的情况下
a. 不能在SQl语句中,进行四则运算, 会降低SQL的查询效率 b. 使用函数 select * from tb1 where reverse(email) = 'zekai'; c. 类型不一致 如果列是字符串类型,传入条件是必须用引号引起来,不然... select * from tb1 where email = 999; #排序条件为索引,则select字段必须也是索引字段,否则无法命中 d. order by select name from s1 order by email desc; 当根据索引排序时候,select查询的字段如果不是索引,则速度仍然很慢 select email from s1 order by email desc; 特别的:如果对主键排序,则还是速度很快: select * from tb1 order by nid desc; e. count(1)或count(列)代替count(*)在mysql中没有差别了 f. 组合索引最左前缀 如果组合索引为:ix_name_email (name,email) ************ where name='zekai' and email='xxxx' -- 命中索引 where name='zekai' -- 命中索引 where email='zekai@qq.com' -- 未命中索引 如果组合索引为:ix_name_email_age (name, email, age): where name='zekai' and email='xxx' and age=12; ---- 命中索引 where name='zekai' and age=12; ---- 命中索引
慢日志
sql语句执行的时间限制
查询
show variables like '%slow%';
设置查询的时间
show variables like '%long%';
排查慢sql的原因
1. 将慢sql记录到日志中 2. 获取慢sql,根据慢sql来优化查询效率(加索引或者修改索引)
tee
tee 地址.log
将接下来所有的操作记录到指定的位置
tee F:\.log 输入的所有sql语句都将被记录