PHP 三年模拟五年面试之一网打尽系列(1)----- MySQL 基础
MySQL 数据类型
一、整数类型
- 包括:TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT
- 属性:UNISINGED
- 取值范围:
- TINYINT:有符号的范围是-128 到 - 127,无符号的范围是 从 0 到 255 的整型数据。一位大小为 1 字节。 - SMALLINT:有符号的范围是-2^15 (-32,768) 到 2^15 - 1 (32,767) 的整型数据,无符号的范围是0到65535。一位大小为 2 个字节。 - MEDIUMINT:有符号的范围是-8388608到8388607,无符号的范围是0到16777215。 一位大小为3个字节。 - INT:有符号的范围是-2^31 (-2,147,483,648) 到 2^31 - 1 (2,147,483,647) 的整型数据(所有数字),无符号的范围是0到4294967295。一位大小为 4 个字节。 - BIGINT:有符号的范围是-2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型数据(所有数字),无符号的范围是0到18446744073709551615。一位为 8 个字节。
- 注意:可以为整数类型指定宽度,例如:INT(11)、对大多数应用是没有意义的,他不会限制值的合法范围,只会影响显示字符的个数。
二、实数类型
- 包括:FLOAT、DOUBLE、DECIMAL
- 介绍:DECIMAL可存储比BIGINT还大的整数;可以用于存储精确的小数。FLOAT和DOUBLE类型支持使用标准的浮点进行近似计算
三、字符串类型
- 包括:VARCHAR、CHAR、TEXT、BLOB
- 注意:
- varchar 类型用户存储可变长字符串,他比定长类型更节省空间。varchar使用1或者2个额外字节记录字符串的长度,列长度小于255字节,使用一个字节表示,否则使用2个。如果存储内容超出指定长度,会被截断。 - char 是定长的,根据定义的字符串长度,分配足够的空间。 char会根据需要采用空格进行填充以方便比较。 char适合存储很短的字符串,或者所有值都接近同一长度(比如MD5加密的密码:char(32))。char长度超出设定的长度,会被截断。 - 对于经常变更的数据,char比varchar更好,char不容易产生碎片。对于非常短的列,char比varchar在存储空间上更有效率。更长的列会消耗更多的内存。 - 尽量避免使用 blob/text 类型,查询会使用临时表,导致严重的性能开销
四、枚举类型(EUNM)
- 注意细节:
- 有时可以使用枚举代替常用的字符串类型,把不重复的集合存储成一个预定义的集合。 - 枚举类型非常紧凑,把列表值压缩到一个或者两个字节内部存储的是整数。 - 尽量避免使用数字作为枚举的常量,避免混乱。 - 排序是按照内部存储的整数进行排序的。 - 枚举表会使表大小大大减小
五、日期和时间
- 尽量使用TIMESTAMP,比DATETIME空间效率高
- 用整数保存时间戳的格式通常不方便处理
- 如果需要存储微秒,可以使用bigint存储
数据表引擎
InnoDB表引擎
- 默认事务型引擎,最主要最广泛的存储引擎,性能非常优秀
- 数据存储在共享表空间,可以通过配置分开
- 对主键查询的性能高于其他类型的存储引擎
- 内部做了很多优化,从磁盘读取数据时自动在内存构建hash索引,插入数据时自动构建插入缓冲区
- 通过一些机制工具支持真正的热备份
- 支持崩溃后的安全恢复
- 支持行级锁
- 支持外键
MyISAM表引擎
- 5.1版本前,MyISAM是默认的存储引擎
- 拥有全文索引、压缩、空间函数
- 不支持事务和行级锁,不支持奔溃后的安全恢复
- 表存储在两个文件,MYD和MYI
- 设计简单,某些场景下性能很好
锁机制
表锁是日常开发中常见的问题,因此也是面试当中最常见的考察点,当多个查询同一时刻进行数据修改时,就会产生并发控制的问题。共享锁和排他锁,其实就是读锁和写锁。
- 写锁:排他的,一个写锁会阻塞其他的写锁和读锁,这样可以只允许一个人进行写入,防止其他用户读取正在写入的资源。 - 读锁:共享的,不堵塞。多个用户可以同时读一个资源,互不干扰
- 表锁:系统性能开销最小,会锁定整张表,MyISAM使用表锁 - 行锁:最大程度地支持并发处理,但是也带来了最大的锁开销,InnoDB 实现行级锁
本作品采用《CC 协议》,转载必须注明作者和本文链接