3.21 MySQL数据库总结
实战题参考材料:
-
MYSQL的安装
-
在window下启动,更换密码
-
>cd /d D:\1.Software\1.Development Software\Mysql\mysql-8.0.22-winx64\bin
-
mysqld --initialize --console
-
mysqld install
-
net start mysql
-
mysql -u root -p
-
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
-
日常启动
-
net start mysql
-
mysql -u root -p
-
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
-
Native的安装
-
连接MYSQL
-
实际操作
-
Mysql的知识
-
三大范式跟oracle相同
-
数据隔离级别跟Oracle相同
-
B树和B+树的不同
-
区别有以下两点:
-
B+树中只有叶子节点会带有指向记录的指针(ROWID),而B树则所有节点都带有,在内部节点出现的索引项不会再出现在叶子节点中。
-
B+树中所有叶子节点都是通过指针连接在一起,而B树不会。
-
B+树的优点:
-
非叶子节点不会带上ROWID,这样,一个块中可以容纳更多的索引项,一是可以降低树的高度。二是一个内部节点可以定位更多的叶子节点。
-
叶子节点之间通过指针来连接,范围扫描将十分简单,而对于B树来说,则需要在叶子节点和内部节点不停的往返移动。
-
B树的优点:
-
对于在内部节点的数据,可直接得到,不必根据叶子节点来定位。
-
聚簇索引和覆盖索引
-
在B+树的索引中,叶子节点可能存储了当前的key值,也可能存储了当前的key值以及整行的数据,这就是聚簇索引和非聚簇索引。 在InnoDB中,只有主键索引是聚簇索引,如果没有主键,则挑选一个唯一键建立聚簇索引。如果没有唯一键,则隐式的生成一个键来建立聚簇索引。
-
聚簇索引:将数据存储与索引放到了一块,找到索引也就找到了数据
-
非聚簇索引:将数据存储于索引分开结构,索引结构的叶子节点指向了数据的对应行
-
澄清一个概念:innodb中,在聚簇索引之上创建的索引称之为辅助索引,辅助索引访问数据总是需要二次查找,非聚簇索引都是辅助索引,像复合索引、前缀索引、唯一索引,辅助索引叶子节点存储的不再是行的物理位置,而是主键值
-
索引类型,参考索引系列博客
-
主键索引: 数据列不允许重复,不允许为NULL,一个表只能有一个主键。
-
唯一索引: 数据列不允许重复,允许为NULL值,一个表允许多个列创建唯一索引。
-
可以通过 ALTER TABLE table_name ADD UNIQUE (column); 创建唯一索引
-
可以通过 ALTER TABLE table_name ADD UNIQUE (column1,column2); 创建唯一组合索引
-
普通索引: 基本的索引类型,没有唯一性的限制,允许为NULL值。
-
可以通过ALTER TABLE table_name ADD INDEX index_name (column);创建普通索引
-
可以通过ALTER TABLE table_name ADD INDEX index_name(column1, column2, column3);创建组合索引
-
全文索引: 是目前搜索引擎使用的一种关键技术。
-
可以通过ALTER TABLE table_name ADD FULLTEXT (column);创建全文索引
-
InnoDB存储引擎和MyISAM存储引擎
-
两者区别
-
Innodb引擎:Innodb引擎提供了对数据库ACID事务的支持。并且还提供了行级锁和外键的约束。它的设计的目标就是处理大数据容量的数据库系统。
-
MyIASM引擎(原本Mysql的默认引擎):不提供事务的支持,也不支持行级锁和外键。
-
MEMORY引擎:所有的数据都在内存中,数据的处理速度快,但是安全性不高。
-
锁:在关系型数据库中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引擎)、表级锁(MYISAM引擎)和页级锁(BDB引擎 )。
-
行级锁 行级锁是Mysql中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁。行级锁能大大减少数据库操作的冲突。其加锁粒度最小,但加锁的开销也最大。行级锁分为共享锁 和 排他锁。
-
特点:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
-
答:InnoDB是基于索引来完成行锁
-
for update 可以根据条件来完成行锁锁定,并且 id 是有索引键的列,如果 id 不是索引键那么InnoDB将完成表锁,并发将无从谈起
-
表级锁 表级锁是MySQL中锁定粒度最大的一种锁,表示对当前操作的整张表加锁,它实现简单,资源消耗较少,被大部分MySQL引擎支持。最常使用的MYISAM与INNODB都支持表级锁定。表级锁定分为表共享读锁(共享锁)与表独占写锁(排他锁)。
-
特点:开销小,加锁快;不会出现死锁;锁定粒度大,发出锁冲突的概率最高,并发度最低。
-
页级锁 页级锁是MySQL中锁定粒度介于行级锁和表级锁中间的一种锁。表级锁速度快,但冲突多,行级冲突少,但速度慢。所以取了折衷的页级,一次锁定相邻的一组记录。
-
特点:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般
-
总结:锁的粒度取决于具体的存储引擎,InnoDB实现了行级锁,页级锁,表级锁。
-
从锁的类别上分MySQL都有哪些锁呢?
-
共享锁: 又叫做读锁。 当用户要进行数据的读取时,对数据加上共享锁。共享锁可以同时加上多个。
-
排他锁: 又叫做写锁。 当用户要进行数据的写入时,对数据加上排他锁。排他锁只可以加一个,他和其他的排他锁,共享锁都相斥
-
功能划分可以分为悲观锁和乐观锁,跟Oracle一样
-
死锁是什么
-
死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方的资源,从而导致恶性循环的现象。
-
解决方式:
-
如果不同程序会并发存取多个表,尽量约定以相同的顺序访问表,可以大大降低死锁机会。
-
在同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁产生概率;
-
对于非常容易产生死锁的业务部分,可以尝试使用升级锁定颗粒度,通过表级锁定来减少死锁产生的概率;
-
如果业务处理不好可以用分布式事务锁或者使用乐观锁
努力不一定成功,但不努力一定会失败~