1. 存储引擎和锁

  1. 存储引擎(处理表的处理器)
    1. 基本操作
      1. 查看所有存储引擎
        mysql>show engines;
      2. 查看已有表的存储引擎
        mysql>show create table 表名;
      3. 创建表指定
        create table 表名(
        ...)engine=innodb,character set utf8;
      4. 已有表
        alter table 表名 engine=innodb;

  2. 锁(MySQL会自动加锁)
    1. 目的:解决客户端并发访问的冲突问题
    2. 锁分类
      1. 读锁(共享锁)
        select:加读锁之后别人不能更改表记录,但可以进行查询
      2. 写锁(互斥锁、排他锁)
        insert、delete、update:加写锁之后别人不能查、不能改
    3. 锁粒度
      1. 表级锁:myisam
      2. 行级锁:innodb

  3. 常用存储引擎特点
    1. InnoDB特点
      /var/lib/mysql/库名
      1. 共享表空间
        表名.frm: 表结构和索引文件
        表名.ibd: 表记录
      2. 支持行级锁
      3. 支持外键、事务操作
    2. MyISAM特点
      1. 独享表空间
        表名.frm : 表结构
        表名.myd : 表记录 mydata
        表名.myi: 索引文件 myindex
      2. 支持表级锁

  4. 如何决定使用哪个存储引擎
    1. 执行查询操作多的表用 MyISAM(使用InnoDB浪费资源)
    2. 执行写操作多的表用 InnoDB

2. MySQL调优

  1. 选择合适的存储引擎
    1. 读操作多: MyISAM
    2. 写操作多:InnoDB
  2. 创建索引
    在select、where、order by常涉及到的字段建立索引
  3. SQL语句的优化
    1. where子句中不使用 !=,否则放弃索引全表扫描
    2. 尽量避免NULL值判断,否则放弃索引全表扫描
      优化前:
        select number from t1 where number is null;
      优化后:
        在number列上设置默认值0,确保number列无NULL值
        select nuumber from t1 where number=0;
    3. 尽量避免 or 连接条件,否则放弃索引全表扫描
      优化前:
        select id from t1 where id=10 or id=20;
      优化后:
        select id from t1 where id=10
        union all
        select id from t1 where id=20
        union all
        select id from t1 where id=30;
    4. 模糊查询尽量避免使用前置%,否则全表扫描
      select name from t1 where name like "%c%";
    5. 尽量避免使用in 和 not in,否则全表扫描
      select id from t1 where id in(1,2,3,4);
      select id from t1 where id between 1 and 4;
    6. 尽量避免使用 select * ...;用具体字段代替*,不要返回用不到的任何字段

3. 事务和事务回滚

  1. 定义:一件事从开始发生到结束的整个过程
  2. 作用:确保数据一致性
  3. 事务和事务回滚应用
    1. MySQL中SQL命令会自动commit到数据库
      show variables like "autocommit";
    2. 事务应用
      1. 开启事务
        mysql > begin
        mysql > ... 一条或多条SQL语句
        ## 此时autocommit被禁用
      2. 终止事务
        mysql >commit; | rollback;

    3. 案例
      1. 背景
        你:建行卡
        你朋友:工商卡
        你在建行自动取款机给你朋友的工商卡转账5000元

      2. 建表
        表1. CCB
          create table CCB(
          name varchar(15),
          money decimal(20,2));
          insert into CCB values("只手遮天",10000);
        表2. ICBC
          create table ICBC(
          name varchar(15),
          money decimal(20,2));
          insert into ICBC values("为所欲为",1000)

      3. 开始转账
        begin;
        update CCB set money=money-5000 where name="只手遮天";
        update ICBC set 宕机了;
        rollback;
        begin;
        update CCB set money=money-5000 where name="只手遮天";
        update ICBC set money=money+5000 where name="为所欲为";

4. 与python交互

  1. 交互类型
    1.python3
      模块名: pymysql
      安装:
      在线:sudo pip3 install pymysql
      离线:pymysql-0.7.11.tar.gz
        $ tar -zxvf pymysql-0.7.11.tar.gz
        $ cd pymysql-0.7.11
        $ sudo python3 setup.py install

    2. python2
      模块名:MySQLdb
      安装:sudo pip install mysql-python

      sqlalchemy安装:
      在线:sudo pip3 install sqlalchemy
      离线:
        $ tar -zxvf SQLAlchemy-1.2.10.tar.gz
        $ cd SQLAlchemy-1.2.10
        $ sudo python3 setup.py install
      验证:
        $ python3
        >>> import sqlalchemy
  2. pymysql使用流程
    1. 建立数据库连接(pymysql.connect(...))
    2. 创建游标对象(c = db.cursor())
    3. 游标方法:c.execute("insert ....")
    4. 提交到数据库:db.commit()
    5. 关闭游标对象:c.close()
    6. 断开数据库连接:db.close()
  3. connect对象
    1. db= pymysql.connect(参数列表)
      1. host: 主机地址,本地 localhost
      2. port: 端口号,默认3306
      3. user: 用户名
      4. password: 密码
      5. database: 库
      6. charset: 编码方式,推荐使用 utf8
    2. 数据库连接对象(db)的方法
      1. db.close() 关闭连接
      2. db.commit() 提交到数据库执行
      3. db.rollback() 回滚
      4. cur = db.cursor() 返回游标对象,用于执行具体SQL命令

    3. 游标对象(cur) 的方法
      1. cur.execute(SQL命令) 执行SQL命令
      2. cur.close() 关闭游标对象
      3. cur.fetchone() 获取查询结果集的第一条数据
        (1, 100001,'河北省')
      4. cur.fetchmany(n) 获取n条
        ((记录1),(记录2))
      5. cut.fetchall() 获取所有记录

      6. orm(Object Relation Mapping 对象关系映射)
        1. 定义
          把对象模型映射到MySQL数据库中
        2. sqlalchemy安装:
          在线:sudo pip3 install sqlalchemy
          离线:
            $ tar -zxvf SQLAlchemy-1.2.10.tar.gz
            $ cd SQLAlchemy-1.2.10
            $ sudo python3 setup.py install
            验证:
              $ python3
              >>> import sqlalchemy

        3. 示例
          class User(Base):
          __tablename__ = "t1" # 声明要创建的表名
          id = Column(Integer,primary_key=True)
          name = Column(String(20))
          解释:
            一个类User --> 一张表 t1
            表中有两个字段:id 和 name

MySQL修炼之路五的更多相关文章

  1. MySQL修炼之路四

    1. 外键(foreign key) 1. 定义:让当前表字段的值在另一个表的范围内选择 2. 语法 foreign key(参考字段名) references 主表(被参考字段名) on delet ...

  2. MySQL修炼之路一

    1. MySQL概述 1. 什么是数据库 存储数据的仓库 2. 都有哪些公司在用数据库 金融机构.游戏网站.购物网站.论坛网站 ... ... 3. 提供数据库服务的软件 1. 软件分类 MySQL. ...

  3. MySQL修炼之路三

    1. SQL查询 1. 执行顺序 3. select ... 聚合函数 from 表名 1. where ... 2. group by ... 4. having ... 5. order by . ...

  4. MySQL修炼之路二

    1. 表字段的操作 1. 语法: alter table 表名 执行动作: 2. 添加字段(add) alter table 表名 add 字段名 数据类型: alter table 表名 add 字 ...

  5. iOS攻城狮修炼之路

    自己总结的学习iOS的笔记,打造一个全面的知识体系,iOS攻城狮修炼之路[持续更新中] iOS学习笔记01-APP相关 iOS学习笔记02-UIScrollView iOS学习笔记03-UITable ...

  6. 我的MYSQL学习心得(五) 运算符

    我的MYSQL学习心得(五) 运算符 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...

  7. Mysql查看版本号的五种方式介绍

    Mysql查看版本号的五种方式介绍 作者: 字体:[增加 减小] 类型:转载 时间:2013-05-03   一.使用命令行模式进入mysql会看到最开始的提示符;二.命令行中使用status可以看到 ...

  8. 微博MySQL优化之路--dockone微信群分享

    微博MySQL优化之路 数据库是所有架构中不可缺少的一环,一旦数据库出现性能问题,那对整个系统都回来带灾难性的后果.并且数据库一旦出现问题,由于数据库天生有状态(分主从)带数据(一般还不小),所以出问 ...

  9. 我的VSTO之路(五):Outlook初步开发之联系人扩展

    原文:我的VSTO之路(五):Outlook初步开发之联系人扩展 上一讲我们完成对Word的介绍,文本开始,我将着重介绍Outlook.Outlook是微软Office中一个非常实用的工具,尤其在一个 ...

随机推荐

  1. Hive的两种操作模式

    Hive的客户端操作 Hive的客户端操作 通过JDBC操作Hive 通过Thrift操作Hive 通过JDBC操作Hive 首先 Hive 启动远程服务 hive --service hiveser ...

  2. SQL优化关于or与in使用

    网上有很多人都在谈论or与in的使用,有的说二者没有什么区别,其实不然,估计是测试做的不够,其实or的效率为O(n),而in的效率为O(log2n),当基数越大时,in的效率就能凸显出来了. 有人做了 ...

  3. ubuntu16.04下安装运行PL-SLAM

    PL-SLAM是Ruben Gomez-Ojeda大神融合点和线特征SLAM的最新成果,并开放了源代码,本博文记录安装运行PL-SLAM遇到的一些问题. 1源代码地址 https://github.c ...

  4. Python绘制六种可视化图表详解,三维图最炫酷!你觉得呢?

    Python绘制六种可视化图表详解,三维图最炫酷!你觉得呢? 可视化图表,有相当多种,但常见的也就下面几种,其他比较复杂一点,大都也是基于如下几种进行组合,变换出来的.对于初学者来说,很容易被这官网上 ...

  5. python中将函数赋值给变量时需要注意的一些问题

    python中将函数赋值给变量时需要注意的一些问题 变量赋值是我们在日常开发中经常会遇到的一个问题,本文主要给大家介绍的是关于python将函数赋值给变量时需要注意的一些问题,分享出来供大家参考学习, ...

  6. Spring MVC -- 单元测试和集成测试

    测试在软件开发中的重要性不言而喻.测试的主要目的是尽早发现错误,最好是在代码开发的同时.逻辑上认为,错误发现的越早,修复的成本越低.如果在编程中发现错误,可以立即更改代码:如果软件发布后,客户发现错误 ...

  7. Oracle树形结构查询(递归)

    引用:https://blog.csdn.net/u012615705/article/details/78321022  文章转自上述地址,内部有稍许改动,如有需要请查看原文. oracle树状结构 ...

  8. (转) C#使用ODP.NET(Oracle.ManagedDataAccess.dll)操作Oracle数据库

    原贴链接:https://www.cnblogs.com/mq0036/p/11052359.html C#使用ODP.NET(Oracle.ManagedDataAccess.dll)操作Oracl ...

  9. CentOS升级kernel

    CentOS升级kernel 升级命令: yum update kernel yum update kernel-devel yum update kernel-firmware yum update ...

  10. php删除目录及目录下的内容

    今天遇到一个问题: java写的API,ppt转图片生成的目录和文件 在使用php调用API完成后,再使用php进行删除时,遇到了删除失败的问题 部署的环境是Ubuntu 导致删除失败的原因是权限的问 ...