MySQL修炼之路五

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;python

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

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

  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;app

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

      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 installspa

    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

相关文章
相关标签/搜索