MySQL数据库基础考点

数据类型

数值类型

类型大小范围(有符号)范围(无符号)用途
TINYINT 1 byte (-128,127) (0,255) 小整数值
SMALLINT 2 bytes (-32 768,32 767) (0,65 535) 大整数值
MEDIUMINT 3 bytes (-8 388 608,8 388 607) (0,16 777 215) 大整数值
INT或INTEGER 4 bytes (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整数值
BIGINT 8 bytes (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 极大整数值
FLOAT 4 bytes (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) 0,(1.175 494 351 E-38,3.402 823 466 E+38) 单精度
浮点数值
DOUBLE 8 bytes (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 双精度
浮点数值
DECIMAL 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 依赖于M和D的值 依赖于M和D的值 小数值 

注意:长度:可以为整数类型指定宽度,例如:int(11),对大多数应用是没有意义的,它不会限制值的合法范围,只会影响显示字符的个数

日期和时间类型

类型 大小
( bytes)
范围 格式 用途
DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
TIME 3 '-838:59:59'/'838:59:59' HH:MM:SS 时间值或持续时间
YEAR 1 1901/2155 YYYY 年份值
DATETIME 8 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和时间值
TIMESTAMP 4

1970-01-01 00:00:00/2038

结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07

YYYYMMDD HHMMSS 混合日期和时间值,时间戳 

字符串类型

类型大小用途
CHAR 0-255 bytes 定长字符串
VARCHAR 0-65535 bytes 变长字符串
TINYBLOB 0-255 bytes 不超过 255 个字符的二进制字符串
TINYTEXT 0-255 bytes 短文本字符串
BLOB 0-65 535 bytes 二进制形式的长文本数据
TEXT 0-65 535 bytes 长文本数据
MEDIUMBLOB 0-16 777 215 bytes 二进制形式的中等长度文本数据
MEDIUMTEXT 0-16 777 215 bytes 中等长度文本数据
LONGBLOB 0-4 294 967 295 bytes 二进制形式的极大文本数据
LONGTEXT 0-4 294 967 295 bytes 极大文本数据 

 注意:

  • varchar使用1个或者2个额外字节记录字符串的长度,列长度小于255字节,使用1个字节表示,否则用2个
  • char适合存储很短的字符串,或者所有的值都接近同一个长度 
  • char长度,超出设定的长度,会被截断
  • 对于经常变更的数据,char比varchar更好,char不容易产生碎片
  • 对于非常短的列,char比varchar在存储空间上更有效率
  • 只分配真正需要的空间,更长的列会消耗更多短的内存
  • 尽量避免使用blob/text类型,查询会使用临时表,导致严重的性能开销

枚举

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

日期和时间类型

  • 尽量使用timestamp,比datetime空间效率高
  • 用整数保存时间戳的格式通常不方便处理,可以使用timestamp
  • 如果需要存储到微秒,可以使用bigint存储

列属性

  auto_increment、default、not null、zerofill

MySQL数据表引擎

InnoDB表引擎

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

MyISAM表引擎

  • 5.1版本以前,myisam是默认的存储引擎
  • 拥有全文索引、压缩、空间函数
  • 不支持事务和行级锁,不支持奔溃后的安全恢复
  • 表存储在两个文件,MYD和MYI
  • 设计简单,某些场景下性能很好

其他表引擎

  Archive、Blackhole、CSV、Memory

在使用过程中,优先使用InnoDB

MySQL锁机制

基础概念

  表锁是日常开发中常见的问题,因此也是面试当中最常见的考察点,当多个查询同一时刻进行数据修改时,就会产生并发控制的问题

  共享锁和排他锁,其实就是读锁和写锁

读锁:共享的,不堵塞,多个用户可以同时,读一个资源,互不干扰

写锁:排他的,一个写锁会阻塞其他的写锁和读锁,这样可以只允许一个人进行写入,防止其他用户读取和正在写入的资源

锁粒度:表锁,系统性能开销最小,会锁定整张表,MyISAM使用表锁

InnoDB实现行级锁

事务处理:

  • MySQL提供事务处理的表引擎:InnoDB
  • 服务器层不管理事务,由下层的引擎实现,所以同一个事务中,使用多种存储引擎不靠谱
  • 在非事务到的表上执行事务操作MySQL不会发出提醒,也不会报错

MySQL存储过程

存储过程:

  • 为以后的使用而保存的一条或者多条MySQL语句的集合
  • 存储过程就是有业务逻辑和流程的集合
  • 可以在存储过程中创建表,更新数据,删除等等

使用场景:

  • 通过把处理封装在容易使用的单元中,简化复杂的操作
  • 保证数据的一致性
  • 简化对变动的管理

MySQL触发器

触发器:提供给程序员和数据分析来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程

使用场景:

  • 可通过数据库中的相关表实现级联更改
  • 实时监控某张表中的某个字段的更改而需要作出相应的处理
  • 某些业务编号的生成等
  • 滥用会造成数据库及应用程序的维护困难
杂念太多,必然根基浅薄
原文地址:https://www.cnblogs.com/starshine-zhp/p/12889391.html