mysql 复习

引擎和数据类型


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 意向排他锁。是表锁。



 




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值