Skip to content

数据类型

MySQL数据类型:整数类型、实数类型、字符串类型、枚举、时间和日期、列属性

  • 整数类型

    1. TINYINT、SMALLINT、MEDIUMINT、INT、BINGINT
    2. tinyint无符号 255 有符号 -128 127
    3. 属性:UNSIGNED 非负
    4. int(3) 在mysql中指定zerofill(位数不够时 用零填充的机制)。相反的未指定是不会进行零填充的
  • 实数类型

    1. FLOAT、DOUBLE、DECIMAL
    2. 注意:decimal可以存储比BIGINT还大的整数;可以用于存储精确的小数
    3. FLOAT与DOUBLE类型支持使用标准的浮点进行近似计算
  • 字符串类型

    1. VARCHAR、CHAR、TEXT、BLOB
    2. VARCHAR类型存储可变长字符串,比定长更加节省空间 (varchar实际存储如果超过了定义的长度 则会将字符串在定长处截断)
    3. VARCHAR使用1或2个额外字节记录字符串的长度,列长度小于255字节,使用1字节表示,否则用2个
    4. CHAR是定长,根据定义的字符串长度分配足够的空间
    5. CHAR会根据所需要采用空格进行填充以方便比较
    6. CHAR适合存储很短的字符串,或者所有值都接近同一个长度
    7. CHAR长度,超出设定的长度,会被截断
    8. 对于经常变更的数据,CHAR比VARCHAR更好,CHAR不容易产生碎片
    9. 对于非常短的列,CHAR比VARCHAR在存储空间上更有效率
    10. 只分配真正需要的空间,更长的列只会消耗更多的内存
    11. 尽量避免使用BLOB与TEXT类型,查询会使用临时表,导致严重的性能开销
  • 枚举

    1. 有时可以使用枚举代替常用的字符串类型
    2. 把不重复的集合存储成一个预定义的集合
    3. 非常紧凑,把列表值压缩到一个或两个字节
    4. 内部存储的是整数
    5. 尽量避免使用数字作为ENUM枚举的常量,易混乱
    6. 排序是按照内部存储的整数进行排序
    7. 枚举表会使表大小大大减少
  • 时间和日期类型

    1. 尽量使用TIMESTAMP,比DATETIME空间效率高
    2. 用证书保存时间戳的格式通常不方便处理
    3. 如果需要存储微秒,可以使用bigint存储
  • 列属性

    1. auto_increment
    2. default
    3. not null
    4. zerofill

Mysql基础操作

  • 常见操作
  • 连接和关闭
  • 其他:
    1. \G 将打印的结果垂直化的显示
    2. \c 取消当前mysql的命令
    3. \q 退出mysql
    4. \s 显示mysql的服务状态
    5. \h 帮助信息
    6. \d 执行符 改分号

MySQL数据表引擎

  • InnoDB表引擎

    1. 默认事务型引擎,最重要最广泛的存储引擎,性能非常优秀
    2. 数据存储在共享表空间,可以通过配置分开(索引与文件都在一个文件存储 所以快)
    3. 对主键查询的性能高于其他类型的存储引擎
    4. 内部做了很多的优化,从磁盘读取数据时自动在内存构建hash索引,插入数据时自动构建插入缓冲区
    5. 通过一些机制和工具支持真正的热备份
    6. 支持崩溃后的安全恢复
    7. 支持行级锁
    8. 支持外键
  • MyISAM

    1. mysql5.1版本之前,MyISAM是默认的存储引擎
    2. 拥有全文检索、压缩、空间函数
    3. 不支持事物和行级锁,不支持崩溃后的安全恢复(支持表锁)
    4. 表存储在两个文件,MYD和MYI(数据和索引)
    5. 设计简单 某些场景下性能很好
  • 其他引擎 Archive、Blackhole、CVS、Memory

  • 优先选择Innodb

MySQL锁机制

  • 基础概念

    1. 表锁是日常开当中常见的问题,因此也是面试当中最常见的考察点,当多个查询同一时刻进行数据修改时,就会产生并发控制的问题
    2. 锁分为共享锁(读锁)和排他锁(写锁)

      1. 共享锁(读锁):共享的,不堵塞,多个用户可以同时读一个资源,互不干扰
      2. 排他锁(写锁):排他的,一个写锁会阻塞其他的写锁和读锁,这样可以只允许一个人进行写入,防止其他用户读取正在写入的资源
    3. 锁粒度:

      1. 表锁,系统性能开销最小,会锁定整张表,MyISAM使用表锁
      2. 行锁,最大程度地支持并发处理,但是也会带来了最大的锁开销,Innodb实现行级锁

MySQL事物处理

  1. 事务处理
    1. MySQL提供事物处理的引擎 Innodb
    2. 服务器层不管理事物,由下层的引擎实现,所以同一个事务中,使用多种存储引擎不靠谱
    3. 在非事物的表是哪个执行事物操作MySQL不会发出提醒,也不会报错

MySQL存储过程

  • 为以后的使用而保存的一条或多条mysql语句集合
  • 存储过程就是有业务逻辑和流程的集合
  • 可以在存储过程中创建表,更新表,删除等等
  • 使用场景
    1. 通过把处理封装在容易使用的单元中,简化复杂的操作
    2. 保证数据的一致性
    3. 简化对变动的管理

MySQL触发器

  • 触发器
    1. 是提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程
    2. 使用场景:
      1. 可以通过数据库中的相关表实现级联更改(比如改一张表自动去改另外的一张表)
      2. 实时监控某张表中的某个字段的更改而需要作出相应的处理(自动处理)
      3. 某些业务编号的生成
      4. 滥用会造成数据库及应用程序的维护困难

Innodb与MyISAM的区别

  • Innodb支持事物,Innodb支持行锁,Innodb存储在共享空间,Innodb支持崩溃后的安全修复,
    1. 而导致行锁变为表锁的情况之一就是:SQL的更新(update)或者删除(delete)语句中未使用到索引,
    2. 导致在InnoDB在对数据进行相应操作的时候必须把整个表锁起来进行检索(表锁)。而如果使用了索引的话,
    3. InnoDB只会通过索引条件检索数据,而只锁住索引对应的行(行锁)。
    4. MyISAM不支持事物,MyISAM支持表锁,MyISAM不使用共享表空间,MyISAM不支持崩溃后的安全修复,

脏读

  • 就是指一个事物 正在进行 且改了数据但是没有提交 这时候另一个事物也访问这个数据 然后使用了这个数据

不可重复读

  • 一个事物内多次读同一个数据,在这个事物没有结束时,另外一个事物也访问了该同一数据。
  • 那么在第一个事物中的两次读数据之间,由于第二个事物的修改 第一个事物的两次读的结果是不一样的 因此被称为不可重复读

幻读

  • 是指当事物不是独立执行时发生的一种现象,例如当一个事物改变了表中的所有数据行
  • 但此时又有一个事物插入了一条新的数据 以后就会发现操作第一个事物修改之后 还有没有被修改的数据 就好像发生了幻读一样