索引按照算法主要分为B+树索引和Hash索引,B+树索引的实现内部是一颗B+树,hash索引则是
行转列:
行转列主要是用groupBy将其分组然后用聚合函数进行处理
SELECT user_name , MAX(CASE course WHEN '数学' THEN score ELSE 0 END ) 数学, MAX(CASE course WHEN '语文' THEN score ELSE 0 END ) 语文, MAX(CASE course WHEN '英语' THEN score ELSE 0 END ) 英语 FROM test_tb_grade GROUP BY USER_NAME;列转行:
列转行主要是利用union来将每次查询出的列数据集合起来
select user_name, '语文' COURSE , CN_SCORE as SCORE from test_tb_grade2 union select user_name, '数学' COURSE, MATH_SCORE as SCORE from test_tb_grade2 union select user_name, '英语' COURSE, EN_SCORE as SCORE from test_tb_grade2 order by user_name,COURSE;mysql innodb的事务中的隔离性是由锁来保证的,持久性则是由redo日志来保证的
mysql的锁主要分为lock和latch,其中latch主要是保证并发资源的操作的正确性,lock则是对数据库对象的锁定,如锁表,页和行,lock仅在事务的commit或者rollback后才会释放,锁主要分为IS,IX,S,X这四种。IS为意向共享锁,IX为意向排他锁,S为共享锁,X为排他锁。
ISIXSXIS兼容兼容兼容不兼容IX兼容兼容不兼容不兼容S兼容不兼容兼容不兼容X不兼容不兼容不兼容不兼容undo日志和redo日志都是innodb存储引擎的日志。
undo日志存储在数据库内部的一个undo segment中,其存储的页也是通过B+树来进行管理的,undo日志是逻辑日志,存储的是对一条记录进行回滚操作的数据,这个日志还可以对数据库隔离级别进行实现。
redo日志主要是用来保证数据的持久性,它存储的是物理的日志,表示的是对数据文件的页的物理的修改,它是顺序的写入日志。数据库重启后则会根据redo日志来对commit的事务进行恢复。
特点为:
每个结点至多有m个子女除根结点外,每个结点至少有[m/2]个子女,根结点至少有两个子女有k个子女的结点必有k个关键字首先通过辅助索引找对应的主键值,然后通过主键从聚集索引中找到对应的数据
分为聚集索引和辅助索引,其中聚集索引按照主键顺序存储的索引,并且其数据就存储在这个索引的叶子节点中,其辅助索引存储的叶子节点存储的是主键
索引和数据是分开存储的,主键索引和非主键索引的数据结构没有太大区别,它们的叶子节点都是指向对应的数据位置锁支持行级锁表级锁事务支持事务不支持事务全文索引不支持全文索引支持全文索引对于innodb存储引擎其对每一条记录都会由两个隐藏列,一个为DATA_TRX_ID,表示修改这条记录的事务id,一个为DATA_ROLL_PTR,指向其对应的回滚段的位置,回滚段中update类型的回滚记录也会有这两个字段,从而对一条记录有多个版本的回滚链,从而在不同隔离级别则可以通过读取不同版本的数据来完成,对于read uncommited则直接读取最新版本的数据的数据即可,对于read commited则读最新的是提交了的版本的即可,而对于repeatable read .则读其第一read的版本即可。
Durability:持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作
在B树中,你可以将键和值存放在内部节点和叶子节点;但在B+树中,内部节点都是键,没有值,叶子节点同时存放键和值。
B+树的叶子节点有一条链相连,而B树的叶子节点各自独立。
binlog记录的是数据库执行更改的所有操作,主要用作主从复制的操作。
statement 每一条会修改数据的sql都会记录在binlog中。不需要记录每一行的变化,减少了binlog日志量,节约了IO,提高性能。由于sql的执行是有上下文的,因此在保存的时候需要保存相关的信息,同时还有一些使用了函数之类的语句无法被记录复制。row 不记录sql语句上下文相关信息,仅保存哪条记录被修改。记录单元为每一行的改动,基本是可以全部记下来但是由于很多操作,会导致大量行的改动(比如alter table),因此这种模式的文件保存的信息太多,日志量太大。mixed 普通操作使用statement记录,当无法使用statement的时候使用row。