zoukankan      html  css  js  c++  java
  • 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

    竜頭蛇尾

  • 相关阅读:
    怎样使用Chrome模拟手机浏览器測试移动端网站
    [Erlang危机](5.1.3)进程
    Oracle ErrorStack 使用和阅读具体解释
    动态规划之整齐打印
    struts2+Oracle实现管理员查看用户提交的意见功能
    hdu 4956 Poor Hanamichi BestCoder Round #5(数学题)
    2014牡丹江——Known Notation
    诗云:静观天下
    QQ欢乐斗地主心得体会 (三):高倍场攻略
    QQ欢乐斗地主心得体会 (三):高倍场攻略
  • 原文地址:https://www.cnblogs.com/jimGraymane/p/11772252.html
Copyright © 2011-2022 走看看