写在前面:
据说用2-3周时间看mysql手册可以速成DBA,当然我的目的是学习我可能用到的部分,花的时间也估计只有20-30个小时左右。
摘录的大部分记录着我不熟悉、感兴趣的内容和其他相关参考知识的整理,相对手册来说并不完整。需要完整学习请前往手册传送门。
知道一件事和表达一件事是完成不同的。摘录是为了帮助自己更清楚地理解问题、帮助自己在一段时间后可以快速重复学习。
第1章:一般信息
1.4.4. MySQL表最大能达到多少
MySQL 3.22限制的表大小为4GB。
由于在MySQL 3.23中使用了MyISAM存储引擎,最大表尺寸增加到了65536TB(2567 – 1字节)
。由于允许的表尺寸更大,MySQL数据库的最大有效表尺寸通常是由操作系统对文件大小的限制决定的,而不是由MySQL内部限制决定的。
InnoDB存储引擎将InnoDB表保存在一个表空间内,该表空间可由数个文件创建。这样,表的大小就能超过单独文件的最大容量。表空间可包括原始磁盘分区,从而使得很大的表成为可能。表空间的最大容量为64TB
。
在默认情况下,MySQL创建的MyISAM表允许的最大尺寸为4GB。你可以使用SHOW TABLE STATUS语句或myisamchk -dv tbl_name检查表的最大尺寸。
时间范围
YEAR列类型能够在1个字节
内保存0年以及1901~2155
年,并能使用两位或四位数字显示它们。所有的两位数字
年份均被视为介于1970~2069
年之间
TIMESTAMP列的值为0,这是因为年份值(2040,9999)超出了TIMESTAMP的最大范围。TIMESTAMP数据类型用于保存当前时间,在32位机器上,支持的取值范围是19700101000000~20300101000000(带符号值)。在64位机器上,TIMESTAMP能处理的值达2106(无符号值)。
1.8.5. MySQL与标准SQL的差别
1.8.5.1. 子查询
“子查询”指的是嵌套在另一语句中的SELECT语句。“导出表”(未命名视图)是另一语句的FROM子句中的子查询。
1.8.5.2. SELECT INTO TABLE
INSERT INTO tbl_temp2 (fld_id)
SELECT tbl_temp1.fld_order_id
FROM tbl_temp1 WHERE tbl_temp1.fld_order_id > 100;
1.8.5.3. 事务和原子操作
支持采用InnoDB和BDB事务存储引擎的事务。
MySQL服务器中的其他非事务性存储引擎(如MyISAM)遵从不同的数据完整性范例,称之为“原子操作”。
是否利用原子操作的速度更好地服务于你的应用程序,或使用事务特性。该选择可按表进行。
事务性和非事务性表类型之间的权衡主要取决于性能。事务性表对内存和磁盘空间的要求更高,CPU开销也更大。另一方面,多种事务性表类型,如InnoDB,也能提供很多显著特性。
1.8.5.4. 存储程序和触发程序
1.8.5.5. 外键
1.8.5.6. 视图
View(视图)十分有用,它允许用户像单个表那样访问一组关系(表)
,而且仅允许对它们的这类访问。视图也能限制对行的访问(特定表的子集)。
1.8.6. MySQL处理约束的方式
1.8.6.1. PRIMARY KEY和UNIQUE索引约束
通常情况下,当你试图INSERT或UPDATE会导致主键、唯一键或外键冲突的行时,将出现错误。如果你正在使用事务性存储引擎时,如InnoDB,MySQL会自动回滚语句。如果你正在使用非事务性存储引擎,MySQL将在出错的行上停止执行语句,剩余的行也不再处理。
如果你希望忽略这类键冲突,可使用MySQL支持的、用于INSERT和UPDATE的IGNORE关键字。在这种情况下,MySQL将忽略任何键冲突,并继续处理下一行。
1.8.6.2. 对无效数据的约束
如果将“不正确”的值插入到列,如将NULL值插入非NULL列,或将过大的数值插入数值列,MySQL会将这些列设置为“最可能的值”,而不是生成错误信息。
-
如果试图将超范围的值保存到数值列,MySQL服务器将保存0(最小的可能值)取而代之,或最大的可能值。
-
对于字符串,MySQL或保存空字符串,或将字符串尽可能多的部分保存到列中。
-
如果打算将不是以数值开头的字符串保存到数值列,MySQL将保存0。
-
MySQL允许将特定的不正确日期值保存到DATE和DATETIME列(如“2000-02-31”或“2000-02-00”)。如果MySQL能保存日期值并准确检索相同的值,MySQL就能按给定的值保存它。如果日期完全不正确(超出服务器能保存的范围)将在列中保存特殊的日期值“0000-00-00”取而代之。
-
如果试图将NULL值保存到不接受NULL值的列,对于单行INSERT语句,将出现错误。对于多行INSERT语句或INSERT INTO … SELECT语句,MySQL服务器会保存针对列数据类型的隐含默认值。一般情况下,对于数值类型,它是0,对于字符串类型,它是空字符串(‘’),对于日期和时间类型是“zero”。
-
如果INSERT语句未为列指定值,如果列定义包含明确的DEFAULT子句,MySQL将插入默认值。如果在定义中没有这类DEFAULT子句,MySQL会插入列数据类型的隐含默认值。
STRICT_TRANS_TABLES的工作方式:
-
对于事务性存储引擎,在语句中任何地方出现的不良数据值均会导致放弃语句并执行回滚。
-
对于非事务性存储引擎,如果错误出现在要插入或更新的第1行,将放弃语句。(在这种情况下,可以认为语句未改变表,就像事务表一样)。首行后出现的错误不会导致放弃语句。取而代之的是,将调整不良数据值,并给出告警,而不是错误。换句话讲,使用STRICT_TRANS_TABLES后,错误值会导致MySQL执行回滚操作,如果可以,所有更新到此为止。
1.8.6.3. ENUM和SET约束
ENUM列总有1个默认值。如果未指定默认值,对于包含NULL的列,默认值为NULL;否则,第1个枚举值将被当作默认值。
-
如果在ENUM列中插入了不正确的值,或者,如果使用IGNORE将值强制插入了ENUM列,会将其设置为保留的枚举值0,对于字符串情形,将显示为空字符串。
-
如果在SET列中插入了不正确值,该值将被忽略。例如,如果列能包含值“a”、“b”和“c”,并赋值“a,x,b,y”,结果为“a,b”。