参考博文 1 。
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/6785227071de770ba2e64c679997c1dc.png)
知识点
1.Decimal
DECIMAL(N,M)中M值的是小数部分的位数,若插入的值未指定小数部分或者小数部分不足M位则会自动补到M位小数,若插入的值小数部分超过了M为则会发生截断,截取前M位小数。N值得是整数部分加小数部分的总长度,也即插入的数字整数部分不能超过N-M位,否则不能成功插入,会报超出范围的错误。
2.char和varchar
- 1、char的长度是不可变的,而varchar的长度是可变的
字段b:类型char(10), 值为:abc,存储为:abc (abc+7个空格)
字段d:类型varchar(10), 值为:abc,存储为:abc (自动变为3个的长度)
- 2、超出长度自动截取
字段c:类型char(3), 值为:abcdefg,存储为:abc(defg自动删除)
字段e:类型varchar(3), 值为:abcdefg,存储为:abc (defg自动删除)
- 3、var(10)和char(10),都表示可存10个字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放10个
- 4、char最多可以存放255个字符
(mysql4.0版本)varchar的最大长度为65535个字节,varchar可存放的字符数跟编码有关
字符类型若为gbk,每个字符最多占2个字节,最大长度不能超过32766个字符
字符类型若为utf8,每个字符最多占3个字节,最大长度不能超过21845个字符
Mysql5.0版本之后varchar的最大长度是65535个字符
- 5、char和varchar的最大长度限制是mysql规定的
3.范式
- 第二范式
对主键的部分依赖:某个字段依赖复合主键中的一部分。
解决方案:新增一个独立字段作为主键。
- 第三范式
消除对主键的传递函数依赖。例子: 由主键id确定了什么课,又有什么课确定了什么老师,这就是传递函数依赖。
解决方案:将表拆分成两张表。
4.数据库引擎的选择:
5.锁扩展
- 表级锁(
table-level lock):lock tables <table_name1>,<table_name2>... read/write,unlock tables <table_name1>,<table_name2>...
。其中read是共享锁,一旦锁定任何客户端都不可读;write是独占/写锁,只有加锁的客户端可读可写,其他客户端既不可读也不可写。锁定的是一张表或几张表。 - 行级锁
(row-level lock)
:锁定的是一行或几行记录。 - 共享锁:
select * from <table_name> where <条件> LOCK IN SHARE MODE;
, - 对查询的记录增加共享锁;
select * from <table_name> where <条件> FOR UPDATE;
,对查询的记录增加排他锁。 - 间隙锁:这里值得注意的是:innodb的行锁,其实是一个子范围锁,依据条件锁定部分范围,而不是就映射到具体的行上,因此还有一个学名:间隙锁。比如
select * from stu where id < 20 LOCK IN SHARE MODE
会锁定id在20左右以下的范围,你可能无法插入id为18或22的一条新纪录。