引擎和数据类型
1 mysql 的存储引擎。 常用3 种
MyISAM InnoDB MEMORY
MyISAM 适用于查询操作较多的。 不支持事务。
InnoDB 支持事务机制,适用于更改较多的。
MEMORY 存储的数据量小,但是查询快。
2 int
计算机2 进制。 1个字节是8位。 所以tinyint 占一个位数,所以最大值是 2的7次方 -1 等于 127,第一位是符号位,标识正负的,0 正 1 负。最小值是 -(2的7次方)-1 为 -128.
2 小数 float 和dubbo。decmal 。 10 位以上精度用dubbo。 还有 decmal 可以更精确。
3 bit 插入是2 进制 。很少用。
4 date
time(只显示秒) timstamp(秒,不通时区用) date(日) datetime(秒) year (年)
5 char 不变 短 varchar 变 长 text 更长
binary 可以存2 进制 很少用 blob 更大的二进制。视频 。
表的操作
ddl 语言 alert 对表结构的操作。
还有约束 。 nk(不为空) fk(外键) pk(主键) uk(唯一主键) 自动增长 auto-increment,默认值 default
-- 查询数据库的表的大小,长度更具rows 排序
SELECT TABLE_NAME,DATA_LENGTH+INDEX_LENGTH,DATA_LENGTH,INDEX_LENGTH,TABLE_ROWS FROM TABLES WHERE TABLE_SCHEMA='coaches' ORDER BY TABLE_ROWS DESC
索引。
普通索引 , 唯一索引包括唯一约束 (加入你创建了一个唯一约束的列,那么该列自动添加为唯一索引。这点不是很明白) ,多列索引(不知道和单列的区别),全文索引 (用在 varchar text 等 大文本对象上,用来比较文本内容较多的)。
索引方法 Hash tree 。
视图 一张虚假的表,不会存到本地,保存查询结果。方便查询。 没什么用。
触发器 监听A表的事件触发b表的操作 。没什么用。
curd。 基础之基础
read 条件查询 包括 is null between and in like 等。 分组查询 group by ,排序 order by。 limit 。
聚合函数
concat 函数。
多表查询。 自连接 左连接 右连接 子查询 inner join
多表。
child
mysql 常用函数 日期函数的
1 得到当前日期 now() (2017-10-26 09:19:23 ) curdate() (2017-10-26) curTime()(09:19:23)
2 日期转化为时间戳 UNIX_TIMESTAMP() 时间戳转化为 日期 from_unixtime
3 得到日期的年月日 个个部分 。week year mouth 等 也可以用 extract (type from date)
4 对日期的操作 addDate(INTERVAL expr type ) 添加一段时间 subdate (INTERVAL expr type )减少一段时间
5 日期比较 to_days() ,dateDIff(d1,d2) from day
存储过程 与函数。
为什么要用存储过程。 当你执行的一个业务需要多条sql才能满足的时候,j建议使用 存储过程。多条sql分开执行肯能会建立多个连接,影响性能。存储过程只用一次。
函数和存储过程的区别 ,函数必须返回值。
返回 一个结果集的时候可以用 游标,但是mysql 好像不能用存储过程或者函数返回结果集,搞了半天都是返回一条,。
create procedure p_name_two(out nums INT) -- in out INOUT
BEGIN
-- 创建结束标志变量
declare done int default false;
-- 声明游标
DECLARE cursor_first
CURSOR FOR SELECT studentId from user_student ORDER BY studentId asc limit 1;
-- 指定游标循环结束时的返回值
declare continue HANDLER for not found set done = true;
-- 打开游标
open cursor_first;
-- 开始循环游标里的数据
read_loop:loop
-- 遍历游标 指向结果集
FETCH cursor_first into nums;
if done THEN
leave read_loop; -- 跳出游标循环
end if;
-- 结束游标循环
end loop;
-- 关闭 游标
close cursor_first;
END ;
call p_name_two(@S);
SELECT @s;
不过在用Mybatis 的时候 可以直接拿到一个结果。
事务和锁。
事务的特性。a原子性c一致性i隔离性d持久性。当面试问你为什么 使用事务的时候,先给他来一套acid。具体解释一下。然后,综上,当我们遇到需要同事操作或取消的操作的时候可以使用事务。
事务的隔离级别。
默认
read-umcommit 读取未提交内容 。会出现 脏读。因为该隔离界别下的太低了,数据几乎处于共享状态。AB 两个 事务实例,a去查,b去改,但是b 没有提交,可能最后roolback了,但是 a这时候已经读到了b的修改,出现脏读,虽然b最后roolback了,但是已经晚了,a已经看到了。 脏读 故名思铭,就是读错了,读了不该读的东西,不该读的东西就是 b打算回滚的update,就是未提交的东西。
read-commit 读取已提交 。会出现不可重复读的问题。所谓不可重复读,讲究两查一改,指的是在 ab两事务,a去查 ,b去改,a去 查两次,b去改一次并且提交,(我们知道该级别隔离下的数据是可读已提交的。),这时候,如果b 的提交顺序刚刚好在a的两次查询之间,那么他们去会出现查询不一致的情况。即所谓的不可重复读。
repeatable-read 可重复读 会出现幻读。 正所谓解决一个问题,就会出现另一个问题。当我们兴高采烈的使用repeatable-read 保证我们不会出现脏读、不可重复读后,却带来了新的问题。当a 事务 去 对 数据进行了修改操作,b进行了新增操作。a 会发现自己要修改的东西没有全部被修改,多的部分为b的新增。为了解决这个问题,我们引入 mvcc ,原理是为每一个事务加一个版本号,记录下当前版本号下该事务所影响的行数,且记录下来,这次事务提交后,只返回对应记录的行。这样,回到上面的问题,我们更改后是一个版本的事务,然后修改后又是一个版本的事务。所谓i,即便第二次有了新增操作,在第一次的事务中也不会出现了,因为第二次新增的行数,并没有被记录到第一次事务的版本里。
serializable 可串行化,可序列化,最高的隔离级别。 唯一的缺点就是隔离度太高了,高并发谁用谁傻逼。
为了支持我们的事务,我们用锁来提供支持。
1 共享锁。 又称读锁,简称s,当s加到数据a 上时,事务只能读取该a,不能写x。如果另一个事务也想来读需要读a,需要继续加s锁。只有当s锁都释放的时候,才可以x,进行写操作。
2 排它锁。sql 中 执行 update insert delete 都会为记录加上 排他锁,执行 roolback 或者commit时 释放所有锁。 若 数据a 被加了排他锁 x,则该事务可以对a进行写操作,但是其他的共享锁和排他锁都只能x释放后才能再加。
3 意向锁。is 意向共享锁 ix 意向排他锁。是表锁。