Day 016 MySQL-高级

今天继续MySQL,今天的主要内容有,Python和MySQL的交互,MySQL的视图,事务以及索引。

Python和MySQL的交互
  • 是指在Python语句中对数据库进行增删改查的操作
  • 需要首先下载安装DB API模块

    python2: sudo pip install mysqlbd
    python3: sudo pip install pymysql

  • 流程如下图:
    Day 016 MySQL-高级_第1张图片

  • 代码实现
from pymysql import *

def update(inputvalue):
    """
    增加, 修改, 删除、
    注意: 在python中操作数据库的时候, 所有的更新数据的操作不会立即提交到数据库中, 提供了一次可以撤销的操作
    如果是数据的更新操作, 等待数据更新成功之后应该 提交数据, 如果失败应该撤销之前的操作
    host=None, user=None, password="",
                 database=None, port=0, unix_socket=None,
                 charset=''
    :return:
    """
    # 1. 创建和数据库的链接
    conn = connect(host='localhost',
            user='root',
            password='mysql',
            database='jing_dong',
            port=3306,
            charset='utf8')
    # 2. 获取一个数据库操作对象, 类型是cursor 游标类型
    cursor = conn.cursor()
    # 3. 编写一条sql语句 goods_cates
    # sql = """insert into goods_cates (name) values ('洗衣机')"""
    # sql = """update goods_cates set name = '电视机' where id = 12;"""
    sql = 'delete from goods_cates where id = %s'
    # 4. 交给cursor类型的对象来完成sql的执行操作
    ret = cursor.execute(sql, [inputvalue])
    print(ret)
    # 4.1 如果是数据的更新操作, 应该判断数据是否更新成功, 成功就提交数据, 失败就数据回滚(rollback)
    if ret != 0:
        conn.commit()
    else:
        conn.rollback()
    # 5. 关闭连接 , 关闭cursor对象
    cursor.close()
    conn.close()


def select(idstr):
    """
    查询
    :return:
    """
    # 1. 创建和数据库的链接
    conn = connect(host='localhost',
                   user='root',
                   password='mysql',
                   database='jing_dong',
                   port=3306,
                   charset='utf8')
    # 2. 获取一个数据库操作对象, 类型是cursor 游标类型
    cursor = conn.cursor()
    # 3. 编写一条sql语句 goods_cates
    sql = 'select * from goods_cates where id = %s'  % idstr
    # 4. 交给cursor类型的对象来完成sql的执行操作
    # fetchone注意: 如果有数据的情况下返回的数据类型: 元祖, 没有数据: None
    ret = cursor.execute(sql)
    print(ret)
    ret = cursor.fetchone()
    print(ret)

    # fetchall()
    # fetchall 没有数据的情况下返回的是一个空元祖, 有数据: 嵌套的元祖
    ret = cursor.fetchall()
    print(ret)
    # 4.1 如果是数据的更新操作, 应该判断数据是否更新成功, 成功就提交数据, 失败就数据回滚(rollback)
    # 查询不是数据更新操作 不需要commit
    # conn.commit()
    # 5. 关闭连接 , 关闭cursor对象
    cursor.close()
    conn.close()
视图
  • 视图是一种特殊的文件,是把重要的SQL语句封装成的一个文件,可以看做是对查询语句的引用。
  • 应用场景

    1. 需求变更,需要更改SQL语句
    2. 有些重要的数据引用,属于公司机密,不应该让所有技术人员看到,需要封装成视图后由程序员直接调用
    3. 让代码看起来更简介美观一些
  • 代码实现

-- 定义视图
create view v_goods as select * from goods;

-- 查看视图
show tables;

-- 使用视图
select  * from v_goods;
事务
  1. 事务是一个包含几个SQL语句,需要同步执行完毕才生效的机制
  2. 使用场景如,银行的每一笔转账业务都是一个事务, A账户转账到B账户,A账户资金-m,B账户资金+m,必须都成功才算成功,否则就撤掉掉所有操作
事务的四大特征
  1. 原子性(atomicity)
    一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性
  2. 一致性(consistency)
    数据库总是从一个一致性的状态转换到另一个一致性的状态。
  3. 隔离性(isolation)
    通常来说,一个事务所做的修改在最终提交以前,对其他事务是不可见的。
  4. 持久性(durability)
    一旦事务提交,则其所做的修改会永久保存到数据库。(此时即使系统崩溃,修改的数据也不会丢失。)
代码实现
# 开启事务
begin;或者 start transaction;
# 执行事务
select balance from checking where customer_id = 10233276;
update checking set balance = balance - 200.00 where customer_id = 10233276;
update savings set balance = balance + 200.00 where customer_id = 10233276;
# 提交事务
commit;
# 如果需要撤销
rollback;
索引
  1. 索引是一种特殊的文件,是表空间的一个组成部分,包含着对表的所有记录的结构性引用
  2. 通俗地讲,就是表的所有数据的目录,可以加快数据库的查找速度
代码实现
-- 查看索引
show index from goods;
-- 创建索引
-- 如果创建索引的字段是字符串需要指定索引的长度, 如果是数字就不需要
create index 索引名称 on 表名(字段名称(长度))

-- 删除索引
drop index 索引名称 on 表名;

-- 案例 查询大量的数据, 在没有使用索引和使用索引之后的情况下来对比查询的时间
    0. 创建表
    create table test_index(id int unsigned primary key auto_increment,title varchar(11));
    1. 构建大量的假数据 100w
    2. 通过主键查询一条数据, 查看消耗时间
    select * from test_index where  id = 1000000;
    3. 通过非主键字段查询, 获取查看时间
    select * from test_index where title = 'ha-999999';
    4. 给非主键字典创建索引, 在查询一下, 获取查看时间
    create index title_index on test_index(title(11));
    5. 对比时间
    set profiling=1; 开启时间检测, 以后所有的sql语句执行的耗时都会被记录下来
    show profiles;

--索引不是越多越好, 需要给合适的字段添加索引, 等到数据达到一定级别再添加索引
    -- 1. 增加磁盘的开销
    -- 2. 会导致数据更新的速度变慢

你可能感兴趣的:(学习日志)