
04 数据库
数据库
喵了个咪的回忆丶
Java后台
展开
-
聚簇索引和非聚簇索引(主键索引和非主键索引)、回表查询
聚集索引和非聚集索引聚集索引: 按照每张表的主键构造B+树,中间节点用来存放索引,叶子节点(数据页)用来存放行的全部数据,按照主键的顺序排序,每个数据页都通过一个双向链表来连接,因此,聚集索引能够在B+树索引的叶子节点上直接找到数据,而且对主键的排序查找和范围查找速度非常快。(聚集索引的存储不是物理上连续的,而是逻辑上连续的,这样可以降低维护成本。每张表只能有一个聚集索引,因为数据页只能按照一...原创 2019-12-20 22:01:48 · 1385 阅读 · 0 评论 -
索引(B+树)、B+树一个节点有多大?(一千万条数据,B+树多高?)
1. 谈谈对索引的理解索引是存储引擎用于提高数据查询效率的一种数据结构,在Mysql中,存储引擎先在索引中找到对应值,然后根据索引记录找到对应的数据行。Mysql中的索引是在存储引擎层实现的,索引的数据结构和存储引擎有关,在MySQL中使用较多的索引有 Hash 索引和 B+树索引。 InnoDB 默认的是 B+ 树索引。索引也会带来一些负面影响:创建索引和维护索引会耗费时间;索引会占用物理...原创 2019-11-09 16:16:45 · 13541 阅读 · 9 评论 -
InnoDB 和 MyISAM 的比较?
InnoDB 和 MyISAM 的比较?InnoDB:InnoDB是Mysql默认的事务型引擎,用于事务处理,具有事务的ACID特性。支持行级锁采用MVCC来支持高并发,并且实现了四种隔离级别,默认级别是可重复读,而且通过间隙锁策略防止幻读的出现,间隙锁不仅锁定查询涉及的行,还会锁定索引中的间隙,来防止幻影行的插入。InnoDB表采用聚集的方式存储数据,因此每张表的存储都是按主键的顺序...原创 2019-11-07 16:01:33 · 182 阅读 · 0 评论 -
表锁、行锁、共享锁和排他锁(读锁写锁)、意向锁、间隙锁
表锁: 是mysql中开销最小的策略,它会锁定整张表,用户在对表进行写操作前,需要先获得写锁,这会阻塞其他用户对该表的所有读写操作,只有没有写锁时,其他用户才能获得读锁。行锁: 可以最大程度的支持并发处理,同时也带来了最大的锁开销,InnoDB存储引擎实现了行锁,行锁只在存储引擎层实现,不会在mysql服务器层实现。...原创 2019-11-07 13:23:00 · 803 阅读 · 0 评论 -
数据库事务的特性ACID、隔离级别、MVCC、解决幻读
1. 解释下事务及其特性?事务是一组原子性的SQL查询,事务内的语句要么全部执行成功,要么全部执行失败,它有四个特性。原子性:指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。一致性:指事务将数据库从一个一致性的状态转换到另一个一致性的状态。隔离性:指多个事务之间相互隔离、互不干扰。持久性:指事务一旦提交,所做的修改就会永久保存到数据库,即使系统崩溃,已经提交的修改...原创 2019-09-16 21:47:08 · 779 阅读 · 0 评论 -
【Mysql实战45讲】14 count(*)
count(*)如果有个页面经常要显示交易系统的操作记录总数,如何计数?如果用redis来保存这个表的总行数,可能存在一些问题,比如在数据表中插入一行数据后,准备将redis中的计数+1时,redis异常重启了,那刚刚这个+1的操作就丢失了,这个场景下是有解的,就是redis异常重启后,到数据库里单独执行一次 count(*) 来获取真实的行数,并写回到redis即可,由于异常重启不是经常出现的状况,所以这一次全表扫描的成本是可以接受的。但还有个问题是,redis所计数的值是不精确的,比如在执行新增记原创 2021-12-22 17:27:29 · 786 阅读 · 0 评论 -
【Mysql实战45讲】11 给字符串加索引
前缀索引如果给邮箱加索引,可以考虑用前缀索引:alter table testTable add index prefix_index(email(6));如果定义好长度,使用前缀索引可以做到既节省空间,又不额外增加太多查询成本的作用通过 select count(distinct targetField) as L from targetTable; 计算表中某个字段不重的个数通过 select count(distinct left (targetField, 5)) from targetT原创 2021-12-21 20:44:02 · 953 阅读 · 0 评论 -
【Mysql实战45讲】09 普通索引和唯一索引的选择
change buffer当更新一个数据页时,如果数据页在内存中,就直接更新,如果不在内存中,在不影响数据一致性的前提下,InnoDB 会将这些更新操作缓存在 change buffer 中,这样就不需要从磁盘中读入这个数据页了,然后在下次查询需要访问该数据页时,再将数据页读入内存,然后执行 change buffer 中与这个数据页有关的操作。change buffer 的好处是减少了读磁盘,所以可以提升执行速度,而且数据读入内存中需要占用 buffer pool,所以还提高了内存利用率change原创 2021-12-21 19:23:41 · 592 阅读 · 0 评论 -
【Mysql实战45讲】06 全局锁、表锁
根据加锁范围,Mysql中的锁可以分为全局锁、表级锁、行锁1、全局锁指对整个数据库实例加锁,mysql提供了一个加全局读锁的方法,命令是:flush tables with read lock (FTWRL),执行后整个库会处于只读的状态使用场景:对全库进行逻辑备份。但它存在风险,比如用这种方式在主库进行备份,那业务功能将暂时不可用;在从库进行备份,备份期间从库不能执行主库同步过来的binlog,从而导致主从延迟。所以比较好的备份方案是在可重复读的隔离级别下开启一个事务,mysql官方自带的备份工具原创 2021-12-17 09:43:48 · 465 阅读 · 0 评论 -
【Mysql实战45讲】04-05 索引
事务隔离Mysql 是一个支持多引擎的系统,事务是在引擎层实现的,但 MyISAM 引擎不支持事务,InnoDB 引擎支持事务索引二叉树的搜索效率很高,但索引之所以不用二叉树,是因为索引不仅存在内存中,还要写到磁盘上,使用二叉树的话,树的高度会比较高,假设有一棵100万节点的平衡二叉树,那它的树高就为20,一次查询可能需要访问20个数据块,如果从磁盘随机读取一个数据块需要10ms左右的寻址时间,那么对于这个100万行的表,使用二叉树存储时单独访问一个行可能需要20个10ms的时间了,查询耗时较长。希原创 2021-12-09 17:25:17 · 219 阅读 · 0 评论 -
mac安装mysql(2021)
1、官网下载mysql官网地址:https://www.mysql.com/downloads/选择下方的社区版(GPL)点击:MySQL Community Server非m1芯片的mac选择x86,下载dmg注意:安装时选择传统密码2、环境配置vim .bash_profile加上:PATH=$PATH:/usr/local/mysql/bin使配置生效:source .bash_profile测试能否连上mysql: mysql -uroot -p3、配置 .zsh原创 2021-09-04 17:00:26 · 435 阅读 · 0 评论 -
数据库读写分离和分库分表
主写从读原创 2020-06-14 09:31:10 · 293 阅读 · 0 评论 -
Mysql的主从复制
为什么mysql要做主从复制?让主库负责写,从库负责读,这样即使主库出现了锁表,也可以通过读取从库来保证业务的正常运行。通过这种主从复制来进行读写分离,减轻了主数据库的负载。如果主数据库宕机,可以快速将业务系统切换到从数据库上,避免数据丢失。如果对数据库的读写都在同一个数据库服务器中,那随着业务量越来越大,IO访问频率越来越高,从而导致单机无法满足,所以需要做多库的存储,降低磁盘I/O访问的频率,提高单个机器的IO性能。主从复制的原理(它是异步的)主数据库的更新事件(update、inser原创 2020-08-07 16:16:13 · 104 阅读 · 0 评论 -
慢 SQL 的定位和优化、索引失效的场景
如何做慢 SQL 优化?首先用 explain 分析语句的执行计划,查看使用索引的情况,是不是查询没走索引,如果可以加索引解决,优先采用加索引解决。分析语句,看看是否存在一些导致索引失效的用法,是否加载了额外的数据,是否加载了许多结果中并不需要的列,对语句进行分析以及优化。如果对语句的优化已经无法进行,可以考虑表中的数据量是否太大,如果是的话可以进行垂直拆分或者水平拆分。索引失效的场景索引列是表达式的一部分时,会导致索引失效,比如 select id from table where id原创 2020-08-07 14:57:21 · 458 阅读 · 0 评论 -
SQL优化的经验
Mysql 优化技巧1. 数据类型优化使用小而且简单的数据类型,因为它们占用较少的空间,操作代价低。尽量避免使用 null 值。尽量使用相同的数据类型存储相似的值。...原创 2019-12-22 22:57:31 · 206 阅读 · 0 评论 -
哪些字段适合建立索引?如何建立索引
1、表的主键、外键必须有索引;2、数据量超过300的表应该有索引;3、经常与其他表进行连接的表,在连接字段上应该建立索引;4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;5、索引应该建在选择性高的字段上;6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;7、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:A、正确选择复合索引中的主列字...原创 2019-12-03 20:38:16 · 5769 阅读 · 0 评论 -
数据库里大表的优化
大表优化当MySQL单表记录数过大时,数据库的CRUD性能会明显下降,一些常见的优化措施如下:限定数据的范围,比如:我们当用户在查询订单历史的时候,我们可以控制在一个月的范围内。读写分离,主库负责写,从库负责读。...原创 2019-12-24 17:23:17 · 251 阅读 · 0 评论 -
explain
explainexplain 的作用是分析查询语句。它的字段有:id:标识符select_type:查询的类型(simple)table:输出结果集的表partitions:匹配的分区type:表的连接类型。从好到坏的顺序是:(const > eq_ref >) ref > range > index > ALL。ref:通过普通索引查询,并且使用的等号查询。range:索引的范围查找(>=、<、in 等)。index:全索引扫描。All:全原创 2020-08-07 14:44:18 · 108 阅读 · 0 评论 -
SQL算法题
找出a表有,b表没有的数据(left join)select a.id,b.aid from a left JOIN b on a.id = b.aidwhere b.aid is null原创 2020-08-11 10:45:09 · 302 阅读 · 0 评论 -
SQL 语句考点
left join、right join、inner joinLEFT JOIN 关键字从左表返回所有的行,即使右表中没有匹配。如果右表中没有匹配,则结果为 NULL。RIGHT JOIN 关键字从右表返回所有的行,即使左表中没有匹配。如果左表中没有匹配,则结果为 NULL。INNER JOIN 关键字在表中存在至少一个匹配时返回行。如果两表的行没有匹配,则不会列出这些行。...原创 2019-12-12 18:25:44 · 288 阅读 · 0 评论 -
数据库的三大范式
数据库的三大范式第一范式:强调的是列的原子性,列不能够再分成其他几列。第二范式:数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关。第三范式:任何非主属性不依赖于其它非主属性。...原创 2019-11-07 16:44:29 · 124 阅读 · 0 评论 -
联合索引、最左匹配原则、覆盖索引
最左匹配规则以最左边的为起点,任何连续的索引都能匹配上。同时遇到范围查询(>、<、between、like)就会停止匹配。原创 2020-04-21 11:14:46 · 866 阅读 · 1 评论 -
关系型数据库和非关系型数据库
关系型数据库和非关系型数据库的区别非关系型数据库称为NoSQL,以 k-v 键值对的方式将数据存储在缓存中,数据之间没有耦合性,方便进行水平扩展。常见的 NoSQL 有 Redis、Memcached、MongoDB、Hbase。而关系型数据库通过行和列的方式存储数据,这一系列的行和列被称作表,这些表组成了数据库,常见的关系型数据库有 Mysql、Oracle。关系型数据库将数据存放在硬盘中...原创 2020-04-19 15:07:35 · 245 阅读 · 0 评论 -
MySQL 如何实现悲观锁和乐观锁?
MySQL 如何实现悲观锁和乐观锁?乐观锁:更新时带上版本号(cas更新)悲观锁:mysql使用的共享锁和排它锁来实现悲观锁,select…lock in share mode(共享锁),select…for update(排他锁)。原创 2020-08-07 14:17:10 · 737 阅读 · 0 评论 -
死锁的解决方式
数据库死锁的解决方式:死锁是指多个事务在执行时,因争夺锁资源而造成的一种互相等待的现象。解决方法有:超时机制: 通过参数 Innodb_lock_wait_timeout 来设置超时等待时间,两个事务互相等待时,达到设置的超时等待时间后,其中一个事务进行回滚,这样另一个等待的事务就能继续进行了。优点是简单,缺点是如果事务操作更新了很多行,那么进行回滚会非常占用时间。等待图: InnoDB ...原创 2019-12-21 20:39:19 · 318 阅读 · 0 评论 -
主键和唯一索引、主键和外键的区别
主键和唯一索引的区别主键是一种约束,唯一索引是一种索引,两者在本质上是不同的。主键不能 null,而唯一索引可以为 null。主键可以被其他表引用为外键,而唯一索引不行。一个表只能有一个主键,但可以有多个唯一索引。...原创 2019-12-17 20:27:32 · 742 阅读 · 0 评论 -
redo、undo、binLog
redo log (重做日志)redo log 是 InnoDB 引擎特有的一种物理日志,负责把事务对数据库所做的所有修改都记录下来,在之后系统奔溃重启后可以通过 redo log 日志找回这些记录。redo log 是循环写的,空间固定,如果用完了就会覆盖以前的日志。binlog (归档日志)binlog是 server 层的日志,所有引擎都可以使用。它是一种逻辑日志,记录的是对应的 s...原创 2019-11-20 20:02:19 · 198 阅读 · 0 评论 -
数据库中有哪几种数据类型?
数据库中有哪几种数据类型?整型: tiny int,small int,medium int,int,big int,大小分别为 8,16,24,32,64位。浮点型: float、double字符串类型: 定长的 char,变长的 varchar。在进行存储时,char 会删除末尾的空格,varchar 会保留末尾的空格。日期时间类型: 与时区无关的 data time,与时区有关的 ...原创 2019-12-28 13:15:37 · 14651 阅读 · 1 评论 -
Mysql更新一个数据,日志文件里面会有什么变化?
Mysql更新一个数据,日志文件里面会有什么变化?原创 2020-04-24 20:42:16 · 363 阅读 · 0 评论 -
SQL 的执行顺序、临时表
SQL 的执行顺序SELECT DISTINCT < select_list >FROM < left_table > < join_type >JOIN < right_table > ON < join_condition >WHERE < where_condition >GROUP ...原创 2020-04-19 18:58:39 · 357 阅读 · 0 评论 -
手写SQL题
成绩表中所有课程分数和大于240的学生名select name from test group by name having sum(score) > 240原创 2020-04-24 18:18:49 · 386 阅读 · 0 评论 -
三级封锁协议
三级封锁协议一级封锁协议事务修改数据时必须加 X 锁,直到事务结束才释放锁。可以解决丢失修改问题,因为不能同时有两个事务对同一个数据进行修改,那么事务的修改就不会被覆盖。二级封锁协议在一级的基础上,要求读取数据时必须加 S 锁,读取完马上释放 S 锁。可以解决读脏数据问题,因为如果一个事务在对数据进行修改,根据一级封锁协议,会加 X 锁,那么就不能再加 S 锁了,也...原创 2019-12-28 13:42:08 · 1198 阅读 · 0 评论 -
热备、冷备、温备
热备、冷备、温备热备(在线备份):在数据库运行时直接备份,对数据库操作没有任何影响。冷备(离线备份):在数据库停止时进行备份。温备:在数据库运行时加全局读锁备份,保证了备份数据的一致性,但对性能有影响。热备流程备份开始时,记录重做日志的日志序号(LSN)。复制共享表空间和独立表空间的文件。复制完后,再次记录重做日志的日志序号(LSN)。通过前面记录的日志序号来复制在备份时产生...原创 2019-12-22 19:28:56 · 3750 阅读 · 0 评论 -
InnoDB存储引擎对 select 语句的加锁
对 select 语句支持两种一致性的锁定读操作:select … for update : 对读取的行记录加排他锁(X)。select … lock in share mode : 对读取的行记录加共享锁(S)。...原创 2019-12-21 16:13:55 · 318 阅读 · 0 评论 -
InnoDB 引擎中的缓冲池(Buffer Pool)
缓冲池InnoDB 存储引擎是基于磁盘存储的,由于CPU的速度远大于磁盘的速度,所以它采用了缓冲池的技术来提高数据库的整体性能。缓冲池是一块内存区域,在进行读取页的操作时,首先将从磁盘中读到的页存放在缓冲池中,下一次再读到相同的页时会先判断页是否在缓冲池中,如果命中了,就直接从缓冲池中读取,否则才去磁盘中读取。修改操作也是先修改缓冲池中的页,然后在空闲的时候再刷新到磁盘中。缓冲池中缓存了索引...原创 2019-12-20 18:45:24 · 424 阅读 · 0 评论 -
【Mysql实战45讲】02 | 一条SQL更新语句是如何执行的?
一条SQL更新语句是如何执行的? 与执行流程不一样的地方是,更新了流程还涉及两个重要的日志模块:① redo log (重做日志);② binlog (归档日志) 。 它们有三点不同:redo log 是 InnoDB 引擎特有的日志,而 binlog 是 Server 层的日志,所有引擎都可以使用。(MySQL 整体来看,有两块:一块是 Server 层,主要做的是 MySQL 功能层面...原创 2019-11-17 22:47:47 · 157 阅读 · 0 评论 -
Mysql版本问题
1. 项目使用的是什么版本的Mysql?为什么选择这个版本?mysql8.0以前,元数据的信息存储在frm文件中,而mysql8.0后,这个frm文件将不再存在,所有的元数据都使用InnoDB引擎来存储。InnoDB的DDL语句支持原子操作,也就是要么全部成功,要么全部回滚支持定义资源管理组,可用来控制线程的优先级和它能使用的资源,目前,能被管理的资源只有CPU资源。支持角色功能,...原创 2019-11-15 16:32:09 · 348 阅读 · 0 评论 -
【Mysql实战45讲】01 一条sql查询语句是如何执行的
mysql 基本架构图:MySQL 可以分为 Server 层和存储引擎两部分:Server层:Mysql大部分的核心功能都在这一层,比如解析、优化、查询缓存。存储引擎:负责数据的存储和提取。其架构是插件式的,支持 InnoDB、MyISAM 等多个存储引擎,不同的存储引擎共用一个 Server 层。...原创 2019-11-07 12:54:15 · 323 阅读 · 0 评论