博客整理day36 python操作数据库
python day36 python操作mysql
一 数据库的连接
import pymysql
conn = pymysql.connect('数据库ip','用户','密码','数据库名') #打开数据库连接
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) #返回的值是字典类型
cursor.execute('sql语句')
res = cursor.fetchall() #取出所有的数据,返回列表套字典
res = cursor.fetchone() #取出一条数据,返回字典
res = cursor.fetchmany(5) #自定义获取多少数据,返回列表套字典
print(res)
cursor.close()
conn.close()
sql注入问题
是指通过客户输入到后台的那些能到数据库得到数据的位置上,恶性的输入一些对数据有害的操作。
#解决方法
username = input('请输入用户名:')
password = input('请输入密码:')
sql = 'select * from user where name = %s and password = %s'
cursor.execute(sql,(username,password))
conn.connect = pymysql.connect(host='loaclhost',user='root',password='123',database='test',charset='utf8')
cursor = conn.cursor(cursor=pymysql.cursor.DictCursor) #返回字典
二 对数据库操作
创建表操作
import pymysql
#打开数据库连接
conn = pymysql.connect(
host= 'localhost',user='root',password='123',database='test',charset='utf8'
)
#使用cursor()创建一个游标对象
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
#使用execute()方法执行sql,如果表存在则删除
cursor.execute('drop table if exists user')
sql = 'create table user(
id int auto_increment primary key,
name varchar(100),
password int
)'
cursor.execute(sql)
cursor.close()
conn.close()
操作数据
增加数据
import pymysql
#打开数据库连接
conn = pymysql.connect(
host= 'localhost',user='root',password='123',database='test',charset='utf8'
)
#使用cursor()创建一个游标对象
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
#-------------------------------------------------------------
#增加一条数据
sql = 'insert into user(name,password) values (%, %s)'
cursor.execute(sql,('momo','123'))
#添加多条数据
data = [
('momo1','123'),
('momo2','123'),
('momo3','123'),
]
cursor.execute(sql,data)
#-----------------------------------------------------------------
conn.commit()
cursor.close()
conn.close()
修改数据
import pymysql
#打开数据库连接
conn = pymysql.connect(
host= 'localhost',user='root',password='123',database='test',charset='utf8'
)
#使用cursor()创建一个游标对象
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
#-------------------------------------------------------------
#修改数据
sql = 'update user name=%s where id=%s'
cursor.execute(sql,('simple',1))
#-----------------------------------------------------------------
conn.commit()
cursor.close()
conn.close()
删除数据
import pymysql
#打开数据库连接
conn = pymysql.connect(
host= 'localhost',user='root',password='123',database='test',charset='utf8'
)
#使用cursor()创建一个游标对象
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
#-------------------------------------------------------------
#删除数据
sql = 'delete from user where id=%s'
cursor.execute(sql,1)
#-----------------------------------------------------------------
conn.commit()
cursor.close()
conn.close()
查找数据
fetchall() #取出所有的数据,返回列表套字典
cursor.fetchone() #取出一条数据,返回字典
cursor.fetchmany(5) #自定义获取多少数据,返回列表套字典
rowcount()#只读属性,并返回执行execute()方法后影响的行数
import pymysql
#打开数据库连接
conn = pymysql.connect(
host= 'localhost',user='root',password='123',database='test',charset='utf8'
)
#使用cursor()创建一个游标对象
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
#-------------------------------------------------------------
username = input('请输入用户名:')
password = input('请输入密码:')
sql = 'select * from user where username = %s and password = %s'
cursor.execute(sql,(username,password))
res = cursor.fetchall() #取出所有的数据,返回列表套字典
if res:
print('登录成功!')
else:
print('登陆失败!')
#-----------------------------------------------------------------
conn.commit()
cursor.close()
conn.close()
三 索引
作用 : 索引的本质是一个特殊的文件,它可以提高数据的查询效率
类似于字典中的目录
索引原理
通过不断地缩小想要获取数据的范围来筛选出最终想要的结果,同事把随机的事件变成顺序的事件,也就是说,有了这个索引机制,可以用同一种查找方式来锁定数据
索引的索引的数据结构:B+树
索引的种类
普通索引 : index :加速查找
唯一索引:
主键索引 : 加速查找 + 不能重复 + 不能为空 primary key
唯一索引 : 加速查找 + 不能重复 unique(name)
联合索引:
联合唯一索引 : unique(name,class)
联合主键索引 : primary key (id,name)
联合普通索引 : index(id,name)
索引创建
主键索引
新增主键索引
create table user( id int auto_increment primary key)charset utf8;
alter table user modify id int auto_increment primary key;
alter table user add primaryky(id);
删除主键索引
alter table user drop primary key;
唯一索引
新增唯一索引
create table user(
id int auto_increment primary key,
name varchar(32) not null default '',
unique u_name(name)
)charset utf8;
create unique index 索引名 on 表名(字段名);
alter table 表名 add unique index 索引名 (字段名);
删除唯一索引
alter table 表名 drop index 索引名;
普通索引
新增普通索引
create table user(
id int auto_increment primary key,
name varchar(32) not null default '',
index u_name(name)
)charset utf8;
create index 索引名 on 表名(字段名);
alter table 表名 add index 索引名(字段名);
删除索引
alter table 表名 drop index 索引名;
联合索引
新增联合索引
索引名(字段名1,字段名2);
索引的优缺
索引加快了查询速度,但加了索引之后,会占用大量的磁盘空间
索引未命中
并不是创建了索引就一定会加快查询速度,要想利用索引达到提高查询速度的效果,需遵循以下问题
-
范围问题,或者说条件不明确,条件中如果出现符号或者关键字 : >,>=,<,<=,!=,between...and..,like,大于号,小于号
-
不能在sql语句中,进行四则运算,不然会降低sql的查询效率
-
使用函数
select * from 表名 where 函数(字段名) = '值';
-
类型不一致
如果列类型是字符串,传入条件需要加引号,不然索引也不能命中,查询效率低
-
order by #排序条件是索引,则查询字段也必须是索引字段
当根据索引排序时,select查询的字段如果不是索引,则速度依然很慢
select 非索引字段名 from 表名 order by 索引字段名 desc;
attention : 但对主键进行排序,不管查询字段是什么,都可以命中
-
最左前缀匹配原则
对于组合索引mysql会一直向右匹配直到遇到范围查询(>,<,between,like)就停止匹配(指的是范围大了,有索引速度也会变慢)
比如 a=1 and b=2 and c=3 and d=4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,abd的顺序可以任意调整
#如果组合索引为 ix_name_email(name,email) where name = 'momo' and email = 'momo@qq.com'; --> 命中索引 where name = 'momo'; --> 命中索引 where email = 'momo@qq.com'; --> 未命中索引
index (a,b,c,d) where a=2 and b=3 and c=4 and d=5 --->命中索引 where a=2 and c=3 and d=4 ----> 未命中索引
explain查询优化
explain select * from user where name='momo' and email='momo@qq.com'\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: user
partitions: NULL
type: ref #索引指向 all
possible_keys: ix_name_email #可能用到的索引
key: ix_name_email #确实用到的索引
key_len: 214 #索引长度
ref: const,const
rows: 1 #扫描的长度
filtered: 100.00
Extra: Using index #使用到了索引
-----------------------------------------------------------------
type:这列最重要,显示了连接使用了哪种类别,有无使用索引,是使用Explain命令分析性能瓶颈的关键项之一。
结果值从好到坏依次是:
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
一般来说,得保证查询至少达到range级别,最好能达到ref,否则就可能会出现性能问题。
possible_keys:列指出MySQL能使用哪个索引在该表中找到行
key:显示MySQL实际决定使用的键(索引)。如果没有选择索引,键是NULL
覆盖索引
innoDB存储引擎支持覆盖索引(covering index,或称索引覆盖),即从辅助索引中就可以得到查询记录,而不需要查询聚集索引中的记录
优点: 辅助索引不包含整行记录的所有信息,因此其大小要远小于聚集索引,可以减少大量的IO操作
select id from user where id=2000;
四 慢日志管理
查看慢sql的相关变量
show variables like '%slow%';
配置慢sql的变量
#set global 变量名 = 值
set global slow_query_log = on;
set global slow_query_log_file="D:/mysql-5.7.28/data/myslow.log";
set global long_query_time=1;