MySQL数据库4Python操作mysql、索引、慢查询日志
一、Python 操作 mysql
pymysql是通过python操作mysql的模块,需要先安装,方法:pip install pymysql
1.1python 操作 mysql
操作步骤:
1.配置连接数据库的参数
host配置的是IP地址,若果是本机则用localhost,user配置用户权限,之后配置账户和密码,这里的账户密码指登录数据库的账户和密码,database配置需要操作的数据库,之后是配置要链接的数据库的编码。
2.设置默认返回的数据类型
3.发送SQL指令
4.获取返回的数据
import pymysql
#连接数据库的参数
conn = pymysql.connect(host='localhost',user='root',
password='123zgh',database='test2',
charset='utf8')
#cursor = conn.cursor() 默认返回的是元组类型
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
#默认返回字典类型
sql = "select * from userinfo"
cursor.execute(sql)
res1 = cursor.fetchone()#取出一条数据,返回的是字典
print(res1)
res = cursor.fetchall()#取出所有的数据,返回的是列表套字典
print(res)
cursor.close()
conn.close()
{'id': 1, 'name': 'xiaozhu', 'depart_id': 1}
[{'id': 2, 'name': 'xiaoyu', 'depart_id': 1}, {'id': 3, 'name': 'laohe', 'depart_id': 2}, {'id': 4, 'name': 'longge', 'depart_id': 2}, {'id': 5, 'name': 'ludi', 'depart_id': 3}, {'id': 6, 'name': 'xiaoguo', 'depart_id': 4}]
通过例子可以看出数据的读出是一条一条读出的。
1.2查询数据
Python查询Mysql使用 fetchone() 方法获取单条数据,使用
fetchall()
:方法获取多条数据。fetchone()
: 该方法获取下一个查询结果集。结果集是一个对象fetchall()
: 接收全部的返回结果行.- rowcount: 这是一个只读属性,并返回执行execute()方法后影响的行数。
import pymysql
#连接数据库的参数
conn = pymysql.connect(host='localhost',user='root',
password='123zgh',database='test2',
charset='utf8')
#cursor = conn.cursor() 默认返回的是元组类型
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
#默认返回字典类型
sql = "select * from userinfo"
cursor.execute(sql)
res1 = cursor.fetchone()#取出一条数据,返回的是字典
print(res1)
res = cursor.fetchall()#取出所有的数据,返回的是列表套字典
print(res)
res2 = cursor.rowcount#返回的是int型,不能加括号
print(res2)
conn.commit()#对数据的增删改一定要提交,否则更改不成功,而且主键id还会增加,pycharm还不会报错,很坑
cursor.close()
conn.close()
1.3增加(添加、更新)数据
使用到的方法:
cursor.execute()增加一条数据
cursor.executemany()增加多条数据
conn.commit()提交发送的SQL语句
对数据的增删改一定要提交,否则更改不成功,而且主键id还会增加,pycharm还不会报错,很坑
print(cursor.lastrowid)获取最后一行的ID值,只是将原来的最后一行id加一,如果一次插入多行,并不能正确显示主键最后一行的id
例子1插入一条数据
import pymysql
#连接数据库的参数
conn = pymysql.connect(host='localhost',user='root',
password='123zgh',database='test2',
charset='utf8')
#cursor = conn.cursor() 默认返回的是元组类型
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
#默认返回字典类型
sql = "insert into user (name,password) values (%s,%s)"
cursor.execute(sql,('abc','deg'))#括号内填写需要增加的数据,此方式为增加一条数据
print(cursor.lastrowid)#获取最后一行的ID值
conn.commit()#对数据的增删改一定要提交,否则更改不成功,而且主键id还会增加,pycharm还不会报错,很坑
cursor.close()
conn.close()
mysql> select * from user;
+----+----------+----------+
| id | name | password |
+----+----------+----------+
| 2 | xiaoming | 1563sdi |
| 3 | abc | deg |
| 5 | abc | deg |
+----+----------+----------+
3 rows in set (0.00 sec)
例子二插入多条数据
import pymysql
#连接数据库的参数
conn = pymysql.connect(host='localhost',user='root',
password='123zgh',database='test2',
charset='utf8')
#cursor = conn.cursor() 默认返回的是元组类型
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
#默认返回字典类型
data = [('xiaozhu1','145656'),('xiaohzhu2','14965'),('xiaozhu3','61500')]
sql = "insert into user (name,password) values (%s,%s)"
# cursor.execute(sql,('abc','deg'))#括号内填写需要增加的数据
cursor.executemany(sql,data)
print(cursor.lastrowid)#获取最后一行的ID值,只是将原来的最后一行id加一,
# 如果一次插入多行,并不能正确显示主键最后一行的id
conn.commit()#对数据的增删改一定要提交,否则更改不成功,而且主键id还会增加,pycharm还不会报错,很坑
cursor.close()
conn.close()
1.4修改数据
修改数据、增加数据、删除数据其实就是将相应的SQL语句和要修改的对象发送给数据库,然后数据库按照相应的语句进行执行。
import pymysql
conn = pymysql.connect(host='localhost',user='root',
password='123zgh',database='test2',
charset='utf8')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
sql = "update user set name=%s where id=%s"
cursor.execute(sql,('xiaoyu',2))
conn.commit()
cursor.close()
conn.close()
1.5删除数据
sql = "delete from user where id=%s"
import pymysql
conn = pymysql.connect(host='localhost',user='root',
password='123zgh',database='test2',
charset='utf8')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
#sql = "update user set name=%s where id=%s"
sql = "delete from user where id=%s"
cursor.execute(sql,(1,))#这里的数据元组里面只有一个元素时不加逗号也可以正常删除,但是最好加上
conn.commit()
cursor.close()
conn.close()
1.6SQL注入问题
1.6.1问题的引入
当我们的登录程序这样写的时候,我们输入用户名:xxx ' or 1=1 #就可以将发送到mysql的指令改变以至于不用用户名和密码也能够获取用户的数据,如输入以后成了select * from user where name='xiaozhu' or 1=1 #' and password='156'则后面的密码部分被注释,where条件也发生了改变or后面的条件始终成立。
import pymysql
user = input('输入用户名:').strip()
pwd = input('输入密码:').strip()
conn = pymysql.connect(host='localhost',user='root',password='123zgh',
database='test2',
charset='utf8')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
sql = "select * from user where name='%s' and password='%s'" % (user,pwd)
print(sql)
cursor.execute(sql)
# print(sql)
res = cursor.fetchall()
print(res)
cursor.close()
conn.close()
if res:
print('登录成功')
else:
print('登录失败')
1.6.2解决方法
我们在写登录程序时可以使用pymysql提供的方法,或者自己写程序判断用户输入的字符是否有问题。
sql = "select * from user where name=%s and password=%s"
cursor.execute(sql,(user,pwd))
import pymysql
user = input('输入用户名:').strip()
pwd = input('输入密码:').strip()
conn = pymysql.connect(host='localhost',user='root',password='123zgh',
database='test2',
charset='utf8')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
sql = "select * from user where name=%s and password=%s"
cursor.execute(sql,(user,pwd))
# print(sql)
res = cursor.fetchall()
print(res)
cursor.close()
conn.close()
if res:
print('登录成功')
else:
print('登录失败')
二、索引
mysql的索引作用和字典的索引,图书馆的图书索引的作用都是一样的,目的都是为了提高查找的速度。
2.1索引的本质
数据库的索引本质是一个特殊的文件,可以提高数据的查找速度。
2.2索引的底层原理
底层原理是B+树(涉及的数据结构与算法知识较多,以后有机会再做介绍)
2.3索引的分类
2.3.1主键索引
依据primary key进行查找数据,特点:提高查找效率,且主键的记录数据不重复,不为空
2.3.2唯一索引
添加方式:某一列的字段名的数据类型后面加unique(字段名)
特点:提高查找效率,且唯一索引记录数据不重复,不为空
2.3.3联合唯一索引
添加方式:unique(字段名1,字段名2......)
特点:提高查找效率,且组合在一起的字段记录数据不重复(单列数据可以重复,组合在一起不能重复),不为空
2.3.4普通索引
index(字段名)
特点:没有上述主键唯一索引对数据的要求
2.3.5联合索引
index(字段1,字段2……)
特点:没有上述主键唯一索引对数据的要求
2.4索引的创建
2.4.1主键索引的创建与删除
2.4.1.1新增主键索引
方式1
create table xxx(
id int auto_increment primary key
);
方式2
create table xxx(
id int auto_increment, primary key(id)
);
方式3
alter table xxx change id id int auto_increment primary key;
方式4
alter table yyy add primary key (id);
2.4.1.2删除主键索引
如果主键是自增id,不能直接使用下面的方法删除,需要先将其修改为非自增id,然后再用下面的方法删除(这种情况在实际应用中几乎不会出现)。
alter table yyy drop primary key;
2.4.2唯一索引的创建与删除
2.4.2.1创建唯一索引
方式1
create table XXX(
id int auto_increment primary key,
name varchar(32) not null default '',
unique u_name (name) )
#u_name是给唯一索引起的名字,方便以后删除索引或查找问题
方式2
create unique index 索引名 on 表名 (字段名);
方式3
alter table 表名 add unique index 索引名(字段名)
2.4.2.2删除唯一索引
alter table 表名 drop index 索引名;
2.4.3普通索引的创建与删除
2.4.3.1普通索引的创建
方式1
create table 表名(
id int auto_increment primary key,
name varchar(32) not null default '',
index 普通索引名(字段名)
)
方式2
create index 索引名 on 表名(字段名);
方式3
alter table 表名 add index 索引名(字段名);
2.4.3.2普通索引的删除
alter table 表名 drop index 索引名;
2.5索引的优缺点
优点:加快了查询速度
缺点:占用了大量的磁盘空间*.ibd是存储数据和索引的文件,可通过查看这个文件的大小对比创建索引前和创建索引后的差别。
2.6不会命中索引的情况
2.6.1不会命中索引的情况
不会命中索引指:创建的索引么有用上,没有达到快速查找的目的。
情况1
在SQL语句中使用四则运算,会降低SQL的查询效率。
情况2
在SQL语句中使用函数。如
select * from user where reverse(email) = 'guanghao';
#reverse的功能是反转'guanghao'然后在email里面查找
情况3
类型不一致:如果列是字符串类型,传入的条件必须先加引号,不然找不着。
情况4
排序条件为索引,则select字段也必须是索引字段,否则无法命中。
如使用order by时
select name from user order by email desc;
上面的SQL语句如果email是索引,则select email可以通过索引快速查找,如果select 的不是索引那一列,则不会触发索引,查找速度依然很慢。
例外情况:如果对主键排序,查找其他列条件,速度也很快。
如select * from 表名 order by id desc;
情况5
count(1)、count(列)、count(*)查找速度没太大差别
情况6
组合索引遵循最左前缀原则
当创建联合索引时如name,email均创建了索引,则可以命中索引的查找方式有:
方式1
select * from user where name='guanghao' and email='guanghao@qq.com';
方式2
select * from user where name='guanghao';
如果where 后面的条件是email则无法命中索引。
如果联合索引的列不止两列则要从左向右按顺序排列查找才可以命中索引,如果中间跳过了某列只要最左边列存在就能够命中索引。如下例
index(a,b,c,d)
where a=1 and b=2 and c=3 and d=4 #命中索引
where a=1 and c=3 and d=4 #命中索引
2.6.2查看索引是否命中的方法
explain select * from 表名 where 查询的条件\G;
如:
mysql> explain select password from user where id=6\G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: user
type: const
possible_keys: PRIMARY 可能用到的索引
key: PRIMARY 确实用到的索引
key_len: 4 索引长度
ref: const
rows: 1 扫描的长度(这里可以确定是否使用了索引)
Extra: NULL 是否使用了索引
1 row in set (0.00 sec)
2.6.3索引覆盖
索引覆盖就是按照索引去查数据。
2.7慢查询日志
2.7.1查看慢SQL的相关变量
mysql> 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 慢日志查询是默认关闭状态 |
| slow_query_log_file | E:\mysql\mysql-5.6.46-winx64\data\ZGH-PC-slow.log |记录慢日志的位置,
+---------------------------+---------------------------------------------------+可配置
5 rows in set (0.03 sec)
mysql> show variables like '%long%';
+--------------------------------------------------------+-----------+
| Variable_name | Value |
+--------------------------------------------------------+-----------+
| long_query_time | 10.000000 |
默认当查找时间大于10秒会记录为慢SQL,我们需要对其进行配置修改其记录为慢SQL的时间。
2.7.2配置慢SQL的变量
set global 变量名 = 值
set global slow_query_log = on;慢日志查询配置为on
set global slow_query_log_file="D:/mysql-5.6.46/data/myslow.log";配置慢日志存储路径(路径不能有空格,否则会配置不成功)
set global long_query_time=1;配置记录为慢日志的捕捉时间
MySQL数据库4Python操作mysql、索引、慢查询日志的更多相关文章
- mysql数据库----python操作mysql ------pymysql和SQLAchemy
本篇对于Python操作MySQL主要使用两种方式: 原生模块 pymsql ORM框架 SQLAchemy 一.pymysql pymsql是Python中操作MySQL的模块,其使用方法和MySQ ...
- python操作mysql数据库系列-操作MySql数据库(二)
接口测试框架层级目录结构示意图: page目录下面的mysqlTest.py:存放的是mysql的操作代码 utils目录下面的helper.py:存放的是公共的配置方法 log目录log.md:存放 ...
- Mysql数据库常规操作(建表、查询)
一.表单操作 1-1.创建表 create table tb_name( id in primary key auto_increment); 1-2.查看表 desc table_name; ...
- 重新学习MySQL数据库4:Mysql索引实现原理
重新学习Mysql数据库4:Mysql索引实现原理 MySQL索引类型 (https://www.cnblogs.com/luyucheng/p/6289714.html) 一.简介 MySQL目前主 ...
- Mysql数据库的数据类型、索引、锁、事务和视图
Mysql数据库的数据类型.索引.锁.事务和视图 数据的类型 1)数据类型: 数据长什么样? 数据需要多少空间来存放? 系统内置数据类型和用户定义数据类型 2)MySql 支持多种列类型: 数值类型 ...
- DBA必备:MySQL数据库常用操作和技巧
DBA必备:MySQL数据库常用操作和技巧 2011-02-25 15:31 kaduo it168 字号:T | T MySQL数据库可以说是DBA们最常见和常用的数据库之一,为了方便大家使用,老M ...
- php笔记08:数据库编程---使用php的MySQL扩展库操作MySQL数据库
1.使用php的MySQL扩展库操作MySQL数据库: php有3种方式操作MySQL数据库 (1)mysql扩展库 (2)mysqli扩展库 (3)pdo mysql扩展库与mysql数据库 ...
- C语言对mysql数据库的操作
原文:C语言对mysql数据库的操作 这已经是一相当老的话题.不过今天我才首次使用,把今天的一些体会写下来,也许能给一些新手带来一定的帮助,更重要的是供自己今后忘记的怎么使用而进行查阅的! 我们言归正 ...
- PHP mysql 扩展库 操作mysql数据库步骤
一.mysql 扩展库操作mysql数据库步骤如下: 1.获取连接 2.选择数据库 3.设置操作编码 4.发送指令(ddl数据定义/dml数据操作/dql数据查询/dtl数据事务控制) 5.接收返回的 ...
随机推荐
- WPF 绑定数据方式
======================================================================== Foreground="{Binding P ...
- 红帽虚拟化RHEV-安装RHEV-M
目录 目录 前言 软件环境 时间同步 更新系统 安装并配置RHEV-M 添加域并为用户授权远程登陆 安装rhevm报告 安装Spice协议 最后 前言 在红帽虚拟化RHEV-架构简介篇中介绍了RHEV ...
- 阶段3 1.Mybatis_07.Mybatis的连接池及事务_6 mybatis中的事务原理和自动提交设置
在实际的开发中,建议使用连接池的形式. JNDI的资料 H:\BaiDu\黑马传智JavaEE57期 2019最新基础+就业+在职加薪\讲义+笔记+资料\主流框架\31.会员版(2.0)-就业课(2. ...
- SELECTION-SCREEN屏幕范例
1. SELECTIION-SCREEN的語法: SELECTION-SCREEN BEGIN OF SCREEN SCR....SELECTION-SCREEN END OF SCREEN SCR. ...
- Web UI自动化测试基础——元素定位(一)
本篇文章整理了元素定位的基础知识——单个元素定位方式. 一.单个元素定位方式简介 1. find_element_by_id 通过元素的id属性进行定位.以百度首页为例,首先进入https://www ...
- js for 循环
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- vue使用笔记一
1.vue-cli安装 sudo npm install -g @vue/cli 2.查看是否安装成功 vue --version 3.创建项目 vue create hello-world 4.启动 ...
- [转帖]CentOS 7 使用kubeadm 部署 Kubernetes
CentOS 7 使用kubeadm 部署 Kubernetes 关闭swap 执行swapoff临时关闭swap. 重启后会失效,若要永久关闭,可以编辑/etc/fstab文件,将其中swap分 ...
- 发布项目到github上web服务器来运行
$ git add dist Administrator@LuoTong- MINGW32 /D/react_workspace (master) $ git commit -m "git ...
- FTP-学习笔记(1)
1.简单的SFTP.FTP文件上传下载 SftpTools.java package com.lfy.mian; import com.jcraft.jsch.*; import java.io.Fi ...