mysqlII

昨日回顾

今日内容:

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

竜頭蛇尾

原文地址:https://www.cnblogs.com/jimGraymane/p/11772252.html