数据库的事务有没有了解?事务的特性是什么?
ACID 原子性 一致性 隔离性 持久化
事务的隔离级别
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
未提交读取(read uncommitted) | √ | √ | √ |
已提交读取(read committed) | × | √ | √ |
可重复读取(repeatable read) | × | × | √ |
串行化(rerializable) | × | × | × |
默认隔离级别
oracle是已提交读mysql是可重复读
快照读,当前读
当前读读到所有已提交事务的最新值for updata
快照读读的是历史版本
sql语言分类
数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL
表锁行锁共享锁
分布式数据库事务
各个数据库解决自己身上的事务,然后通过应用程序来控制多个数据库上面的事务。
隔离级别是怎样实现的
- 未提交读
事务在读数据的时候并未对数据加锁。
事务在修改数据的时候只对数据增加行级共享锁。 - 已提交读
事务对当前被读取的数据加 行级共享锁(当读到时才加锁),一旦读完该行,立即释放该行级共享锁;
事务在更新某数据的瞬间(就是发生更新的瞬间),必须先对其加 行级排他锁,直到事务结束才释放。 - 可重复读
事务在读取某数据的瞬间(就是开始读取的瞬间),必须先对其加行级共享锁,直到事务结束才释放;
事务在更新某数据的瞬间(就是发生更新的瞬间),必须先对其加行级排他锁,直到事务结束才释放。 - 可序列化
事务在读取数据时,必须先对其加 表级共享锁 ,直到事务结束才释放;
事务在更新数据时,必须先对其加 表级排他锁 ,直到事务结束才释放。
怎么查看一个字段有没有添加索引?
- 添加索引: alter table table_name ADD INDEX index_name(colum_name);
- 查看索引: show index from table_name;
- 删除索引: drop index index_name on table_name ;
索引的类型
- UNIQUE(唯一索引):不可以出现相同的值,可以有NULL值
- INDEX(普通索引):允许出现相同的索引内容
- PROMARY KEY(主键索引):不允许出现相同的值
- fulltext index(全文索引):可以针对值中的某个单词,但效率确实不敢恭维
- 组合索引:实质上是将多个字段建到一个索引里,列值的组合必须唯一
一张表里面有id自增主键,inset了17条记录后删除15,16,17,再把mysql重启,再insert一条记录,这条的id是15还是18
需要根据表的类型来区分
- MYISAM型:因为此类型表会将自增主键的最大id记录在数据文件中,所以重启也不会消失
- InnoDB型:此类的自增主键只存于内存中,重启操作hi导致最大id消失,结果是15
默认端口号
mysql3306 oracle1433
mysql表的最大大小
查看表最大容量语句
select
concat(truncate(sum(MAX_DATA_LENGTH)/1024/1024,2),"MB") max_data_size
from information_schema.tables
where table_schema="mydata"&&TABLE_NAME="test"
MYISAM一张表的最大容量是1791.99TB,InnoDB这里显示为0表示不做限定。可能与表底层结构有关(InnoDB是单表,MyISAM有三个文件),我使用InnoDB插了4个小时也只插了不到500w条数据,大小不过几百m我就放弃了。
数据量大了分库更多的是机械方面的原因比如不够将索引加载至内存,所以会造成性能的降低,并不是表不能再存储了。
数据库三大范式
第一范式:数据库的每一个字段都是不可分割
第二范式:数据库的非主属性只依赖于主键
第三范式:不存在非主熟悉性对关键字的传递函数依赖
分库分表语句
水平分库复制表结构使用limit关键字
create table test_cut LIKE test
insert into test_cut SELECT * from test LIMIT 10000
索引的底层结构是什么?为什么没有采用其他的结构?
B+树为什么不会像二叉树一样在极端情况下退化成链表?
sql语句执行过程
客户端发送sql->服务器接收并查询缓存,没有->向数据库查询->解析生成解析树,预处理,优化sql->调用引擎的api进行处理->返回客户端