数据库分类
1 关系型数据库:通过表和表之间,行和列之间的关系进行数据的存储
如:mysql
2 非关系型数据库:对象存储,通过对象的自身的属性来决定。
如:redis
数据库删除语句对比:
truncate和delete的区别:truncate会重新设置自增列(计数器归0)且不会影响事务。
去重:
select distinct * from 表
排序:
升序 ASC 降序 DESC
where 。。。
order by 字段 DESC
Mysql常用函数
数学运算: ABS() 绝对值 ; ceiling() 向上取整; rand():随机数(0-1); floor():向下取整;
字符串:char_length('') :字符串长度; concat('','','') 拼接字符串;
replace('我说','我','你') 返回"你是" substr('',1,2) 从第一个开始截取2个
聚合函数:count(),sum(),AVG(),MAX(),MIN()
数据库MD5加密
主要增强算法复杂度和不可逆性
MD5不可逆,具体的值的MD5是一样的
加密: update 表 set pwd=MD5(pwd) where id=1
事务
原则:ACID原则
原子性:要么都成功要么都失败(两个人转账例子)
一致性:针对一个事务操作前和操作后的状态一致 (不管是a转账给b还是b转账给a他们的总数一定不变)
持久性:事务结束后的数据不随着外界原因导致数据丢失
若出现断电等外界原因时,事务若未提交,则恢复到原始状态;若已提交,则不可逆。
隔离性:多个用户同时操作不会互相影响
隔离性会遇到的情况:
脏读:指一个事务读取了另外的一个事务未提交的数据。 例:A给B转账200但是还未提交,此时C来查看B只有100
虚读(幻读):指在一个事务内读取到了别的事务插入的数据导致前后不一致(比如多了一行)
不可重复读:在一个事务读取表中的某一行数据,多次读取结果不同(中途有别的用户进行数据更新操作)
事务隔离级别
事务隔离级别,就是为了解决上面几种问题而诞生的。为什么要有事务隔离级别,因为事务隔离级别越高,在并发下会产生的问题就越少,但同时付出的性能消耗也将越大,因此很多时候必须在并发性和性能之间做一个权衡。所以设立了几种事务隔离级别,以便让不同的项目可以根据自己项目的并发情况选择合适的事务隔离级别,对于在事务隔离级别之外会产生的并发问题,在代码中做补偿。
事务隔离级别有4种,但是像Spring会提供给用户5种,来看一下:
1、DEFAULT
默认隔离级别,每种数据库支持的事务隔离级别不一样,如果Spring配置事务时将isolation设置为这个值的话,那么将使用底层数据库的默认事务隔离级别。顺便说一句,如果使用的MySQL,可以使用"select @@tx_isolation"来查看默认的事务隔离级别
2、READ_UNCOMMITTED
读未提交,即能够读取到没有被提交的数据,所以很明显这个级别的隔离机制无法解决脏读、不可重复读、幻读中的任何一种,因此很少使用
3、READ_COMMITED
读已提交,即能够读到那些已经提交的数据,自然能够防止脏读,但是无法限制不可重复读和幻读
4、REPEATABLE_READ
重复读取,即在数据读出来之后加锁,类似"select * from XXX for update",明确数据读取出来就是为了更新用的,所以要加一把锁,防止别人修改它。REPEATABLE_READ的意思也类似,读取了一条数据,这个事务不结束,别的事务就不可以改这条记录,这样就解决了脏读、不可重复读的问题,但是幻读的问题还是无法解决
5、SERLALIZABLE
串行化,最高的事务隔离级别,不管多少事务,挨个运行完一个事务的所有子事务之后才可以执行另外一个事务里面的所有子事务,这样就解决了脏读、不可重复读和幻读的问题了
Mysql是默认开启事务自动提交的
set autocommit=0 关闭
set autocommit=1 开启(默认的)
手动写事务需要先关闭默认的事务提交(设为0)
start transation 标记一个事务的开始,从这个之后的sql都在同一个事务内
commit 提交成功 rollback 失败,回滚为初始的样子
索引
是帮助Mysql 高效获取数据的数据结构,提取句子主干,就可以得到索引的本质;索引是数据结构
分类
主键索引(primary key)不为空且唯一
唯一的标识,不可重复,只能有一个列作为主键
唯一索引(unique key) 唯一
避免重复的列出现。
默认索引:可用index或者key关键字设置