mysql

1、索引

索引方法
HASH索引
B+TREE索引

索引类型
UNIQUE
PRIMARY
FULLTEXT
NORMAL

最左前缀
联合索引的多个字段中,只有当查询条件为联合索引的一个字段时,查询才能使用该索引。
索引可以用于查询条件字段为索引字段,根据字段值最左若干个字符进行的模糊查询

覆盖索引
覆盖索引是指,索引上的信息足够满足查询请求,不需要再回到主键上去取数据。


事务的ACID属性:
原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
一致性(Consistency)
事务前后数据的完整性必须保持一致。
隔离性(Isolation)
事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
持久性(Durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响


并发事务带来的几个问题:
1、Lost Update 更新丢失
a. 第一类更新丢失,回滚覆盖:撤消一个事务时,在该事务内的写操作要回滚,把其它已提交的事务写入的数据覆盖了。
b. 第二类更新丢失,提交覆盖:提交一个事务时,写操作依赖于事务内读到的数据,读发生在其他事务提交前,写发生在其他事务提交后,把其他已提交的事务写入的数据覆盖了。这是不可重复读的特例。
2、Dirty Read 脏读:一个事务读到了另一个未提交的事务写的数据。
3、Non-Repeatable Read 不可重复读:一个事务中两次读同一行数据,可是这两次读到的数据不一样。
4、Phantom Read 幻读:一个事务中两次查询,但第二次查询比第一次查询多了或少了几行或几列数据。

事务隔离级别:
未提交读(Read uncommitted) 脏读
已提交读(Read committed) 不可重复读
可重复读(Repeatable read) 幻读
可串行化(Serializable)

MVCC
每行数据都存在一个版本,每次数据更新时都更新该版本。
修改时Copy出当前版本随意修改,各个事务之间无干扰。
保存时比较版本号,如果成功(commit),则覆盖原记录;失败则放弃copy(rollback)
InnoDB存储引擎MVCC的实现策略
在每一行数据中额外保存两个隐藏的列:当前行创建时的版本号和删除时的版本号(可能为空,其实还有一列称为回滚指针,用于事务回滚,不在本文范畴)。这里的版本号并不是实际的时间值,而是系统版本号。每开始新的事务,系统版本号都会自动递增。事务开始时刻的系统版本号会作为事务的版本号,用来和查询每行记录的版本号进行比较。

每个事务又有自己的版本号,这样事务内执行CRUD操作时,就通过版本号的比较来达到数据版本控制的目的。

常用语句

查看版本
select version()

查看表索引
SHOW INDEX FROM TABLE_NAME

查询带行号
mysql
set @rowNum = 0;
select @rowNum:+1 as rn,a.* from table_name a
8.0后版本
select row_number()over(order by col) from table_name


sqlserver
select row_number()over(order by col) from table_name


带有更新的插入/replace into
INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=c+1;


mysql enum 和 set 的区别
enum只能是单选,set是多选

相关推荐