四、pymysql模块、索引和慢查询
目录
一、pymysql模块
(一)如何使用
- fetchall():获取所有数据,返回的是列表套字典
- fetchone():获取一条数据,返回的是字典
- fetchmany(size):获取size条数据,返回的是列表套字典
- commit:当sql中有参数时,必须要使用conn.commit()
- executemany:新增多条数据
import pymysql
conn = pymysql.connect(host='localhost',user='root',password='wickyo',database 'test',charset='utf8') # 连接数据库
# 创建一个游标对象cursor
# cursor = conn.cursor() # 默认返回的值是元组类型
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 返回的是字典对象
# 1. 查
sql = 'select * from userinfo'
cursor.execute(sql)
res = cursor.fetchall() # 获取所有的数据,返回的是列表套字典
res = cursor.fetchone() # 获取一条数据,返回的是字典类型
res = cursor.fetchmany(12) # 获取12条数据,返回的是列表套字典
print(res)
# 2. 增
## (1)新增一条数据
sql = "insert into user (name, password) values (%s, %s)"
cursor.execute(sql, ('xxx', 'qwe')) ###
## (2)新增多条数据 executemany
data = [
('zekai1', 'qwe'),
('zekai2', 'qwe1'),
('zekai3', 'qwe2'),
('zekai4', 'qwe3'),
]
cursor.executemany(sql, data)
conn.commit() # 必须要加这一句
print(cursor.lastrowid) # 打印最后一行id
# 3. 修
sql = "update user set name=%s where id=%s"
cursor.execute(sql, ('dgsahdsa', 2))
conn.commit()
# 4. 删
sql = "delete from user where id=%s"
cursor.execute(sql, ('dgsahdsa', 2))
conn.commit()
cursor.close() # 关闭cursor对象
conn.close() #关闭数据库里对象
(二)sql注入问题
利用mysql的#会注释的漏洞,避开密码验证
当输入的用户名为
xxx' or 1=1 #时,下面的例子中sql会变成'select * from user where name = xxx' or 1=1 # and password=%s',#后面的内容会被注释掉,会导致sql注入问题原因
没有做任何检验限制
解决办法
将参数传给execute,利用模块本身进行一个校验
import pymysql
user = input('请输入用户名:')
password = input('请输入密码:')
conn = pymysql.connect(host='localhost',user='root',password='wickyo',databse= 'test',charst='utf8')
cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)
# sql1 = "select * from user where name='%s' and password='%s'" % (user, pwd)
# cursor.execute(sql1)
sql2 = 'select * from user where name = %s and password=%s'
cursor.execute(sql2,(user,pwd))
res = cursor.fetchall()
print(res)
cursor.close()
conn.close()
if res:
print('登陆成功')
else:
print('登录失败')
二、索引
优缺点:
优点:加快查询速度
缺点:占用大量磁盘空间
索引的本质:是一个特殊的文件
索引的底层原理:B+树
(一)主键索引
- 加速查找
- 不能重复
- 不能为空
(1)增
# 1. 创建时
create table xxx(
id int auto_increment,
primary(id)
)
# 2. 通过modify修改字段
alter table xxx modify id int auto_increment primary key;
# 3. 通过add修改字段
alter table xxx add primary key(id);
(2)删
alter table t1 drop primary key
(二)唯一索引
unique(字段名)
- 加速查找
- 不能重复
(1)增
# 1. 创建表时
craete table t2(
id int auto_increment primary key,
name varchar(32) not null default'',
unique u_name(name)
)charset utf8;
# 2.创建表结构
create unique index 索引名 on 表名 (字段名;)
# 例子
create unique index ix_name on t2(name);
# 3. 修改表结构
alter table 表名 add unique index 唯一索引名(字段名)
#例子
alter table t2 add unique index ix_name (name)
(2)删
alter table 表名 drop index 唯一索引名;
# 例子
alter table t2 drop index u_name;
(三)普通索引
index(字段名),加速查找
(1)增
# 1. 创建表时
create table t3 (
id int auto_incremnt primary key,
name varchar (32) not null default '',
index u_name (name))
# 2. 创建表结构
create index ix_name on t3(name);
# 3. 修改表结构
alter table t3 add index ix_name (name)
(2)删
alter table t3 drop index ix_name;
(四)联合索引
联合主键索引
primary key (id,name)联合唯一索引
unique(id,name)联合普通索引
index(id,name)
(五)不会命中索引的情况
四则运算
不能在SQL语句中,进行四则运算,会降低SQLd的查询效率
使用函数
select * from t1 where reverse(email)= 'wick';类型不一致
如果列是字符串类型,传入条件必须用引号括起来
select * from t1 where email = 999;order by
select name from s1 order by email;当根据索引排序时,如果select查询的字段不是索引,效率也较低
- 如果对主键排序,速度还是很快
select * from t1 order by id ;
- 如果对主键排序,速度还是很快
count
count(*)相较于count(列名)或count(1),结果一昂,前者效率低组合索引最左前缀
select * from user where name = 'wick'and email = 'wick@qq.com';上述场景想要添加索引加快速度,错误中做法:
index ix_name(name)index ix_email(email)正确的做法:
index ix_name_email(name,email)where name = 'wick' and email= 'wick@11.com'此种情况索引命中where name='wick'此种情况也命中where email = 'wick@qq.com'此种情况未命中
注意:
index (a,b,c,d) where a=2 and b=3 and c=1 and d=1; #命中 where a=2 and c=3 and d=4 # 命中 where b =2 and c= 3 and d=3 # 未命中
(六)explain
explain select * from user where name = 'wick' and email = 'wick@qq.com'\G
# 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 使用到了索引
(七)索引覆盖
被查询的列,数据能从索引中取得,而不用通过行定位符 row-locator 再到 row 上获取,即“被查询列要被所建的索引覆盖”,这能够加速查询速度。
select id from t1 where id = 2000;
三、慢查询日志
# 1. 查看慢SQL的相关变量
show variables like '%slow%';
# 2. 查看long相关的变量
show variables like '%long%';
# 3. 配置慢相关的的变量
# set global 变量名=值
# 设置慢查询日志开关
set global slow_query_log = on;
# 设置慢查询日志存储地址
set global slow_query_log_file= 'D:/mysql/data/myslow.log';
# 设置慢查询匹配时间
set global long_query_time = 1
四、pymysql模块、索引和慢查询的更多相关文章
- mysql python pymysql模块 增删改查 查询 fetchone
import pymysql mysql_host = '192.168.0.106' port = 3306 mysql_user = 'root' mysql_pwd = ' encoding = ...
- mysql python pymysql模块 增删改查 查询 字典游标显示
我们看到取得结果是一个元祖,但是不知道是哪个字段的,如果字段多的时候,就比较麻烦 ''' (1, 'mike', '123') (2, 'jack', '456') ''' 用字典显示查询的结果,也可 ...
- mysql python pymysql模块 增删改查 查询 fetchmany fetchall函数
查询的fetchmany fetchall函数 import pymysql mysql_host = '192.168.0.106' port = 3306 mysql_user = 'root' ...
- pymysql 模块 使用目录
mysql python pymysql模块 基本使用 mysql python pymysql模块 增删改查 插入数据 介绍 commit() execute() executemany() 函数 ...
- 第八章| 3. MyAQL数据库|Navicat工具与pymysql模块 | 内置功能 | 索引原理
1.Navicat工具与pymysql模块 在生产环境中操作MySQL数据库还是推荐使用命令行工具mysql,但在我们自己开发测试时,可以使用可视化工具Navicat,以图形界面的形式操作MySQL数 ...
- 多表查询、可视化工具、pymysql模块
create table dep( id int primary key auto_increment, name varchar(16), work varchar(16) ); create ta ...
- python 全栈开发,Day63(子查询,MySQl创建用户和授权,可视化工具Navicat的使用,pymysql模块的使用)
昨日内容回顾 外键的变种三种关系: 多对一: 左表的多 对右表一 成立 左边的一 对右表多 不成立 foreign key(从表的id) refreences 主表的(id) 多对多 建立第三张表(f ...
- MySQL:记录的增删改查、单表查询、约束条件、多表查询、连表、子查询、pymysql模块、MySQL内置功能
数据操作 插入数据(记录): 用insert: 补充:插入查询结果: insert into 表名(字段1,字段2,...字段n) select (字段1,字段2,...字段n) where ...; ...
- MySQL多表查询,Navicat使用,pymysql模块,sql注入问题
一.多表查询 #建表 create table dep( id int, name varchar(20) ); create table emp( id int primary key auto_i ...
随机推荐
- APP功能测试要点(功能测试重点)
APP功能测试要点 1.功能性测试 根据产品需求文档编写测试用例而进行测试,包括客户端的单个功能模块以及功能业务逻辑(功能交互)如:涉及输入的地方需要考虑等价类,边界值,异常或非法等 1.1 安装与卸 ...
- Python学习-is和==区别, encode和decode
一.is 和 == 介绍 1. is 比较的是两个对象的内存地址是否相同,它们是不是同一个对象. 2. == 比较的是两个对象的内容是否相同. 在使用is前,先介绍Python的一个内置函数id( ...
- 第六届蓝桥杯java b组第三题
第三题 三羊献瑞 观察下面的加法算式: 其中,相同的汉字代表相同的数字,不同的汉字代表不同的数字. 请你填写“三羊献瑞”所代表的4位数字(答案唯一),不要填写任何多余内容. 答案这个题目完全可以使用暴 ...
- centos7下mongoDB安装和配置
2018-10-31更新 yum –y install mongodb-org 找不到这个包,清华源: https://mirrors.tuna.tsinghua.edu.cn/help/mongod ...
- Java 代理模式 (二) 动态代理
代理模式 代理(Proxy)是一种设计模式, 提供了对目标对象另外的访问方式:即通过代理访问目标对象. 这样好处: 可以在目标对象实现的基础上,增强额外的功能操作.(扩展目标对象的功能). 代理模式的 ...
- 虚拟现实中自由步行(free-space walking)
之前我们讲到了虚拟现实中漫游方式的分类.虚拟现实中的漫游(travel/navigate)方式,即是应用提供给用户的,在虚拟环境中移动的方式.虚拟现实的漫游方式中,有一种被称为“完全动作线索”1,即用 ...
- Creator3D长什么样?看看官方惊艳的DEMO就知道了,附在线体验!
Shawn 这两天在学习 Creator3D 的官方案例,由于是刚接触 Creator3D 很多东西在没弄清楚之前还是以简单的编辑介绍为主,先了解一下3D场景的基本操作: 观查场景:按住鼠标右键以自己 ...
- Spark 学习笔记之 Spark history Server 搭建
在hdfs上建立文件夹/directory hadoop fs -mkdir /directory 进入conf目录 spark-env.sh 增加以下配置 export SPARK_HISTORY ...
- ELK 学习笔记之 elasticsearch head插件安装
elasticsearch head插件安装: 准备工作: 安装nodejs和npm https://nodejs.org/en/download/ node-v6.11.2-linux-x64.ta ...
- 如何写md格式的文档
一.标题 标题其实和HTML中的h系列很像,想要设置为标题的文字前面加#来表示一个#是一级标题,二个#是二级标题,以此类推.支持六级标题. 注:标准语法一般在#后跟个空格再写文字, 示例: 效果如下: ...