昨日回顾
今日内容:
1.python操作mysql
pymysql
增删改查
import pymysql
### 连接数据库的参数
conn = pymysql.connect(host='localhost',user='root',password='123qwe',database='test',charset='utf8')
# cursor = conn.cursor() ### 默认返回的值是元祖类型
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) ### 返回的值是字典类型 (*********)
sql = "select * from userinfo"
cursor.execute(sql)
# res = cursor.fetchall() ###取出所有的数据 返回的是列表套字典
# res = cursor.fetchone() ###取出一条数据 返回的是字典类型
res = cursor.fetchmany(12) ### 制定获取多少条数据 返回的是列表套字典
print(res) ### 元组类型 ((1, 'zekai', 1), (2, 'xxx', 2), (3, 'zekai1', 3))
cursor.close()
conn.close()
2.sql注入问题
很严重的问题
因为默认使用者都是君子,所以不设防,因此会被人攻击漏洞
import pymysql
user = input('输入用户名:').strip()
pwd = input('输入密码:').strip()
#### 接下来对用户输入的值进行检验
### 连接数据库的参数
conn = pymysql.connect(host='localhost',user='root',password='123qwe',database='test',charset='utf8')
# cursor = conn.cursor() ### 默认返回的值是元祖类型
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) ### 返回的值是字典类型 (*********)
# sql = "select * from user where name='%s' and password='%s'" % (user, pwd)
sql = "select * from user where name=%s and password=%s"
cursor.execute(sql, (user, pwd))
res = cursor.fetchall() ###取出所有的数据 返回的是列表套字典
print(res)
cursor.close()
conn.close()
if res:
print('登录成功')
else:
print('登录失败')
3.增加数据
列表里面套元组才能多值同时添加
主要的方法有
import pymysql
conn =pymysql.connect(host='localhost',user='root',password='123',database='目标')
cursor =conn.cursor(cursor=pymysql.cursors.DictCursor)# 这里是为了让返回的值是字典类型的,不然默认返回的是元组类型
sql="insert into user(name,password)value (%s,%s)"
cursor.execute(sql,('lee','hunter'))
print(cursor.lastrowid)
data=[
('lee','hunter'),
('Lloyd','hasson'),
('Andrew','Arlidge'),
]
cursor.excute(sql,date) ###用于增加多条
conn.commit()
cursor.close()
conn.close()
data=[
(),
(),
]
cursor.excutemany()
conn.commit
4.修改数据
sql="update user set name = %s where id = %s"
cursor.excute(sql,('asdsad',2))
conn.commit()
cursor.close
conn.close
import pymysql
### 连接数据库的参数
conn = pymysql.connect(host='localhost',user='root',password='123qwe',database='test',charset='utf8')
# cursor = conn.cursor() ### 默认返回的值是元祖类型
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) ### 返回的值是字典类型 (*********)
sql = "update user set name=%s where id=%s" #这里用了update而不是使用alter
cursor.execute(sql, ('dgsahdsa', 2))
conn.commit()
cursor.close()
conn.close()
5.删除数据
有外键删不掉
import pymysql
### 连接数据库的参数
conn = pymysql.connect(host='localhost',user='root',password='123qwe',database='test',charset='utf8')
# cursor = conn.cursor() ### 默认返回的值是元祖类型
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) ### 返回的值是字典类型 (*********)
sql = "delete from t3 where id=%s"
cursor.execute(sql, (1,))
conn.commit()
cursor.close()
conn.close()
很简单
lastrowid 可以显示最后一个元素的id
插入三百万条信息
for i in range(3000000):
data=
import pymysql
### 连接数据库的参数
conn = pymysql.connect(host='localhost',user='root',password='123qwe',database='test2',charset='utf8')
# cursor = conn.cursor() ### 默认返回的值是元祖类型
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) ### 返回的值是字典类型 (*********)
sql = "insert into user (name, email) values (%s, %s)"
``
data=[]
for i in range(3000000):
info=('qiezi'+str(i),'qiezi'+str(i)+'@163.com')
data.append(info)
``
cursor.executemany(sql, data) ### 新增多条数据
#
# #### 加如下代码
conn.commit()
cursor.close()
conn.close()
3.索引
为什么要使用索引
索引可以加快查询
比如查字典有两种方式;
1.一页一页找
2.找目录
索引就像查字典的目录一样可以提高查询的效率
索引的底层原理:
B+树
索引的种类:
主键索引:使查询速度变快+不能重复+不能为空primary key
唯一索引:加速查找+不能重复 unique(name)
联合唯一索引:unique(name,Email)
例子:
zekai 123@qq.com
zekai 123@qq.com
普通索引:加速查找 index(name)
联合索引:index(name,Email)
索引的创建:
主键索引:
create table xxx(
id int auto_increment,
primary key (id)
)
alter table xxx change id id int auto_increment primary key;
pt索引创建的时候把唯一索引的unique删除即可
优缺点:
通过观察*.ibd文件可知:
1.索引加快了查询的速度
2.但是加了索引之后,会占用大量磁盘空间
如果查询的是范围的,还是会消耗很多时间
a.不能再sql语句里加入四则运算
b.使用函数
select * from tb1 where reverse(name)
c.类型不一致
如果列是字符串类型,传入条件
select 阻断必须也是索引字段
order by desc
联合索引:根据公司的业务场景,再最常用的几列上添加索引
select * from user where name ='zekai' and email = 'wdnmd'
index ix_name_email(name,email)
explain select
慢查询日志:
查看慢sql的相关变量
show variables like '%slow%';
+---------------------------+-----------------------------------------------+
| Variable_name | Value |
+---------------------------+-----------------------------------------------+
| log_slow_admin_statements | OFF |
| log_slow_slave_statements | OFF |
| slow_launch_time | 2 |
| slow_query_log | OFF ### 默认关闭慢SQl查询日志, on |
| slow_query_log_file | D:mysql-5.7.28dataDESKTOP-910UNQE-slow.log | ## 慢SQL记录的位置
+---------------------------+-----------------------------------------------+
5 rows in set, 1 warning (0.08 sec)
mysql> show variables like '%long%';
+----------------------------------------------------------+-----------+
| Variable_name | Value |
+----------------------------------------------------------+-----------+
| long_query_time | 10.000000 |
配置慢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
竜頭蛇尾