MySQL

4种隔离级别

名称 脏读 不可重复度 幻读

read uncommited 有 有 有
read commited 无 有 有
repeatable read 无 无 有
serilazible 无 无 无
MySQL中的默认隔离级别时read repeatable。

其他数据库中的默认级别通常是read commited。
隔离级别从上至下逐渐增高,隔离级别越高,效率越差。
其中serializable是将所有事务串行执行,效率很低,通常不使用。
脏读:
一个事务读取另一个事务还未提交的数据,这一数据如果因为某些原因被回滚,就读取到了一个无效数据,产生脏读。
不可重复读:
一个事务在运行期间会多次对一个数据进行读取,但在此期间这一数据被其他事务所修改,就会造成同一事务中前后读取结果不一致,产生不可重复读。
幻读:
一个事务在运行期间会多次读取数据统计数据,例如数据总数。在此期间其他事务可能对表中的数据进行插入或删除的操作,造成同一事务前后两次读取到的统计量不一致,产生幻读。

drop,truncate和delete

drop:
删除表或删除数据库,删除整个表或数据库,包括数据和索引,删除后表或数据库的空间会被释放,不可恢复。
truncate:
只能应用在表上,清空一个表内的数据,隐式提交,不会回滚,执行速度比delete快,效果与不带参数的delete相同。
delete:
删除表中的数据,不会释放空间。可以回滚,可以恢复。

innodb和myisam引擎区别

innodb支持事务,myisam不支持事务。
innodb支持行锁和表锁,myisam只支持表锁。
innodb自带聚集型索引,所以innodb中的数据必须有主键,数据与聚集索引存在一起。
myisam在小型应用,跨平台效果好。大量查询时适用。

读写分离,主从分离

为了解决高并发访问的问题,可以使用主从分离的技术。
在一个数据库集群中,选定一个主数据库,其他的数据库都作为从数据库。
所有的读操作全部定位到从数据库,写操作定位到主数据库。主数据库在执行完写操作之后,会把相应的操作记录写到bin-log日志中。
从数据库会周期性的读取主数据库的bin-log日志,将其中的操作记录同步到自身的relay-log中,并在同步之后执行。这样就保证了主从数据库中的内容一致。
从数据库还可以作为主数据库的备份,当主数据库放生宕机时,可以重新选定一个从数据库作为主数据库,并根据原主数据库中的bin-log日志,将其状态同步到原主库宕机之前的状态。

回表

基本SQL语句

增:数据库:create database #{name}
数据表:create table #{name}(字段名)
数据:insert into (字段名) values (?)
增加字段:alter table table_name add 字段名

删:数据库:drop database #{name}
数据表:drop table #{name}
数据:delete from table_name where …
删除字段:alter table table_name drop 字段名

改:数据表:alter table table_name …
数据:update table_name set …

查:数据库:show datebases
数据表:show tables
字段:describe 字段名

内连接,左连接,右连接

内连接:
关键字:join/inner join … on
select * from books b join article a on b.title=a.title;
取两个表的交集。
左连接:
关键字:left join … on
select * from books b left join article a on b.title=a.title;
展示左表的所有数据,并将右表中对应的数据拼接上,如果没有对应的数据则显示null。
右连接:
关键字:right join … on
select * form books b right join article a on b.title=a.title;
展示右表所有数据,并将左表中对应的数据拼接上,如果没有对应的数据则展示null。

事务

事务的特性:
原子性:事务是程序执行时的最小单元,不可继续分割。
一致性:一个事务内的语句要么都成功,要么都失败。
隔离性:事务之间不能相互影响。
持久性:事务的操作结果会持久保存。
事务的隔离级别和存在问题:
第一级别:脏读:当一个事务的操作结果被另一个事务所读取,但原事务的这一结果却因为别的原因最终被抛弃,就会产生脏读。
第二级别:不可重复读取:在一个事务对一个数据的两次操作之间,这一数据被其他事务所修改,就会造成事务前后两次读取到的数据不一致,也就是不可重复读取。
第三级别:幻读:在一个事务处理一个表的过程中,另一个事务对表中的行进行了增加和删除,就会造成原事务两个读取到的数据数目不一致。
隔离级别越高,效率越低。

数据库三范式

第一范式:存储的字段不可分割
第二范式:所有字段必须与主键又直接联系
第三范式:一行中主键外的其他字段不存在依赖关系

索引

索引概述:
索引就是一种特殊的数据结构,可以帮助我们提高查找效率
索引创建的时间:索引
优点:优化查询时间
缺点:占用额外空间,每次更新数据时也会更新相应索引,所以在经常修改的字段不适合做索引
索引分类:
主键索引,唯一索引,普通索引,组合索引,全文索引
在数据要经常进行插入和删除操作时不适合索引。
全文索引实现原理:倒排索引。类似与字典,利用单词的字母顺序做排序的key,单词的位置做value。
聚集索引与非聚集索引:
聚集索引:
数据的排列顺序和主键的排列顺序一致,innodb引擎中,一个表就是以聚集索引建立的,叶子节点的data域中存储着完整的数据。
所以innodb引擎中,一个表必须有且只有一个聚集索引,也就是主键索引,通过主键索引查询效率很快。
缺点是修改繁琐。
非聚集索引:
一个表可以有多个非聚集索引,索引的叶子节点中只保存着数据的地址。
索引结构:
B Tree和B+Tree:
innodb引擎在读取磁盘文件时是以页为单位进行的,一个页的大小一般为16K。
B树:是一种平衡树,每一层的非叶子节点交替存储指向下一层叶子节点的指针和一个数据。对于摸一个叶子节点指针,其指向的叶子节点都大于左边的数据,并且都小于其右边的数据。
B+树:B树的改进。
B+树相对与B树的优化:

  1. B树的每个非叶子节点存储的是指向下一级叶子节点的指针和整个数据。而B+树的非叶子节点中存储的只有指向其叶子节点的指针和主键值(或索引值)。
    当数据本身较大时,B+树可以在每一级的节点中存储更多的指针和键值,从而可以降低深度。 因为一页的大小为16K,一个指针的大小为8B,一个键值的大小通常也不超过8B,所以每层B+树大概可以维护16K / (8B + 8B) 约为1000条数据,三层B+树也就可以维护10^9条数据,可以满足大部分需求。
    因为实际使用时每个节点一般不会填满,所以实际的B+树一般为2-4层。 在innoDB引擎中,根节点是常驻内存的,所以一次查找的磁盘IO次数一般为1-3次。
  2. B+树相邻的叶子节点之间有着链指针,可以方便的进行范围查找。
    建立索引的SQL语句:
    利用 alter table #{table_name} add index #{index_name}(index_column);
    index对应普通索引,unique对应唯一索引,primary key对应主键索引,fulltext对应全文索引

锁的分类:
乐观锁和悲观锁:
乐观锁:在对数据修改不频繁时使用,默认数据在事务操作的过程中不会被别的事务修改。优点是并发行高,缺点是当数据经常被修改时会
产生大量回滚,较低效率。
通常实现方法是对数据进行快照,在事务处理过程中一直使用快照中的数据。在事务处理结束后将快照中的数据与原数据进行比对, 如果相同则保存结果,如果不同则对事务进行回滚。例如MVCC
悲观锁:在对数据修改频繁时使用,默认数据会被其他事务修改。缺点是并发行低。
通常实现方法是在事务处理过程中不允许其他事务访问其数据。
读锁和写锁,又称共享锁和排他锁:
共享锁:读数据时常用,又称读锁,允许其他事务读取加锁数据。
排他锁:写数据时常用,又称写锁,不允许其他事物访问加锁数据。
手动加共享锁:在语句后加lock in share mode
手动加排他锁:在语句后加for update
表锁和行锁:
行锁:加锁一行,可能产生死锁。myisam引擎不支持行锁。优点是并发行好,缺点是处理复杂,可能产生死锁。
表锁:加锁整个表,myisam引擎只支持表锁。优点是处理简单,缺点是并发行低。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值