婚纱设计网站,创意矿泉水瓶子设计,wordpress点击文章跳转外站,十堰网站开发目录 一#xff1a;基础篇
二#xff1a;索引原理和SQL优化
三#xff1a;事务原理
四#xff1a;缓存策略 一#xff1a;基础篇
1#xff1a;定义#xff1a;按照数据结构来组织、存储和管理数据的仓库#xff1b;是一个长期存储在计算机内的、有组织的、可共享 的…目录 一基础篇
二索引原理和SQL优化
三事务原理
四缓存策略 一基础篇
1定义按照数据结构来组织、存储和管理数据的仓库是一个长期存储在计算机内的、有组织的、可共享 的、统一管理的大量数据的集合
2MySql中含有内部连接池用来管理缓冲用户的连接以及线程处理需要缓存的需要。并且使用IO多路复用的select 阻塞IO。并且他的命令处理是在多线程中并发处理的。
3数据库三范式先保持原子性不可分割 / 确保表中的每列和主键完全依赖 / 确保每列和主键直接相关不是间接相关。但是有时候没有必要使用三范式会导致数据库业务涉及到的表变多造成更多的连表查询导致整个性能降低。因此需要考虑反范式。
4五大约束非空约束自增约束唯一约束主键约束包括非空且唯一外键约束。其中外键约束在 innodb 中支持并且满足事务。
5删除数据 dropDDL速度快删除整张表结构和表数据包括索引约束触发器等。但是删除后不能回滚会进行释放空间。 truncateDDL速度比较快会删除表数据其他字段会保留自增字段置为1但是也不能回滚会释放空间以页单位进行删除。 deleteDML速度慢删除部分字段或者全部字段其他保留他是一个条件删除可以进行回滚是标记删除实际并未删除可以进行逐行删除。 6去重是group by select distinct 。条件判断是wheregroup by ... having , ...join ... on ... 。三种
7视图视图是逻辑表自身不含数据内容是通过查询得到。安全使用视图用户只能看到他们被允许查询到的结果集而对表的权限管理无法做到限制某些行和列视图却可以。数据独立源表中的数据修改对视图没有影响。视图可以减少重复语句的书写并且还是个重构利器如果需要将一个表进行拆分成两个表我们可以使用视图来进行操作创建出两个视图这样我们只需要更改数据库结构而不用修改应用程序。
8触发器触发器的执行是由事件自动触发而不是程序调用和手工启动。比如当DML操作的时候就会激活执行。
二索引原理和SQL优化
MySql索引原理和SQL优化_mysql 全文索引sql-CSDN博客
1索引是什么索引是一种有序的存储结构它将单个或多个列的值进行排序。
2索引分类主键索引唯一索引非空索引普通索引组合索引全文索引。在主键索引的B数种中包含数据的全部信息。全文索引是将存储在数据库中的整本书整篇文章的任意内容信息查找。关键词是FULLTEXT。
3为什么使用B数索引而不使用红黑树结构 首先B数相对于高瘦的红黑树来说B树是胖矮的在叶子节点中存放数据并且叶子节点还串联在一起而非叶子节点中存放索引信息。无论是叶子节点还是非叶子节点都是存放在页中的。这样当我们查找数据的时候我们会拥有更少的磁盘IO而且更方便范围查找因为叶子节点是串联在一起的找到第一个叶子节点后可以相继找出其他节点。但是对于红黑树来说需要不断进行搜索。并且每个索引都对应一个B树。 为什么采用多路的树结构一个节点有多条链路相较于平衡二叉搜索树是一个更加矮胖的结构树的高度更低可以较少的磁盘io次数来索引数据。 为什么非叶子节点只存储索引信息B树节点映射固定的大小磁盘数据可以包含更多的索引信息。能快速锁定数据所在叶子节点的位置。 为什么叶子节点依次相连便于范围查询避免中序遍历回溯回去查找下一个节点。 4什么时候使用索引呢 首先我们的索引使用的位置是在wheregroup by order by 的后面使用索引。那么不适合使用索引就是没有这一些判断条件以及区分度不高的列数据很相似的需要经常修改的列表数据量少的。我们创建B树类型的索引就是为了通过比较来找到我们所需要的数据但是当区分度不高的时候反而会降低速度如果经常修改这个列那么我们的B的结构就要经常变化更加影响速率表的数据较少的时候没有必要去创建索引创建索引反而会浪费空间。
5索引方式
每一个索引都有一个B树结构。 聚集索引我们主键构造出的B树叶子节点中存放数据数据也是索引的一部分。并且主键索引就是聚集索引没有主键那就是唯一索引作为聚集索引。 辅助索引二级索引我们在辅助索引B树中叶子节点并不是存储的数据而是存储的主键id。当通过辅助索引查找到主键id后我们再根据主键去查找聚集索引。这里也叫回表查询。覆盖索引是索引包含了查询所需的所有列即索引本身能够覆盖查询的字段需求无需再通过回表操作来获取数据。通过使用覆盖索引可以提高查询性能减少不必要的磁盘I/O和数据传输。也就是我们不要select * 而是select 。。。什么的。最左匹配规则对于组合索引来说我们使用必须要满足从左往右的规则idnameage。这三个只能使用idnameageidnameid这三种方式来使用索引。 6索引的失效和索引原则
索引失效 1当where A and B 的时候其中一个没有索引那么就会失效。 2当索引字段参与了运算。 3索引字段发生隐式转换。 4LIKE模糊匹配通配符以“%”开头。 5在索引字段上使用NOT 6组合索引中没有满足最左匹配。 索引原则 1查询频次较高且数据量大的表建立索引索引选择使用频次较高过滤效果好的列或者组合。 2使用短索引这样节点包含的信息多有较少的磁盘IO操作。 3很长的动态字符串考虑使用前缀索引。 4组合索引中考虑最左匹配原则和覆盖索引。 5选择区分度高的列也就是值相同的越少越好。 6扩展索引在现有索引的基础上添加复合索引最多6个索引。 7不要select * 尽量列出所需要的列方便使用覆盖索引。 8索引列尽量设置为非空 9可以开启自适应hash索引。 三事务原理
MySql 事务原理 - 面试_面试题 mysql事物实现原理-CSDN博客
1事务 事务是什么本质是一个并发的控制单元用户定义的一个操作序列这些操作要么都做要么都不做满足原子操作。 什么时候使用事务并发连接访问的时候。 事务的目的从一种一致性状态转变成另一种一致性状态的时候保证系统始终处于一个完整且正确的状态。 2ACID特性中的隔离性
脏读不可重复读幻读。以及持久性中使用redolog写入物理日志写入磁盘。 undolog通过MVCC记录事务DML操作提交后产生的行数据版本信息。记录DML操作步骤用于回滚业务通过逆运算回滚。 redolog事务提交后记录DML操作对应物理页修改的内容。 3隔离级别 read_uncommitted读未提交读不做任何处理写自动加X锁。脏读、不可重复读、幻读。 read_committed读已提交RC读通过MVCC读取最新版本的数据写自动加X锁。不可重复读、幻读。 repeatable_read可重复读RR读通过MVCC读取开启事务前的行数据写自动加X锁。幻读。 serializable可串行化读自动加S锁写自动加X锁。 4隔离级别的并发异常 脏读一个事务读到另一个未提交事务修改的数据。 不可重复读一个事务内两次读取同一个数据不一样。一个事务提交之后另一个事务中也会发现这个被修改的变量。 幻读一个事务内两次读取同一个范围内的记录得到的结果集不一样当前读和快照读不一致。我们在一个事务中插入一个数据我们另一个事务在查询的时候并未看到这个数据但是插入的时候发现报错。 我们数据库默认的隔离级别就是RR也就是可以发生幻读。我们可以不用提升隔离级别就能解决这个问题那就是手动加锁。具体加锁操作看文章即可。
5MVCC
MVCC是多版本并发控制保证数据的一致性和并发性。可以使多个事务在同时访问数据的时候各自看到不同版本的数据不会互相打扰这样就可以避免锁和等待了。
read_view 是一个事务开始时创建的视图他决定了事务能够看到的数据库版本中的数据版本其中包括自身的事务id已启动但未提交的事务id列表。
其中聚集索引记录的隐藏列存储在行中这个行中包括该事务id。以及数据会指向之前的数据版本用于回滚操作。
6事务的可见性问题
事务可以看到自身事务的修改。事务之间的可见性是已经提交的事务是可以看到的后启动的事务是不可见的在事务列表中已启动但未提交的不可见已提交可见的。
7RC和RR的区别
因为RC和RR都采用了MVCC但是RC是读已提交每次读取数据就会产生一个read_view。而RR是开启事务的时候才会生成一个read_view一直用到事务结束也就是一直能看到一个数据版本。因此RC每次读都能看到最新数据所以产生了不可重复读而RR中解决了。
8什么是快照读和当前读快照读就是从之前拍摄的一个快照中进行读取数据而当前读就是直接读取最新数据。快照读并未采用锁当前读加锁了。
四缓存策略
MySQL的缓存策略_mysql 数据库的缓存策略-CSDN博客
1MySQL 缓存方案用来干什么
首先是MySql的缓存方案他自己的缓存方案和业务层面是没有关系的虽然MySQl也是用来缓存热点数据的但是这些热点数据并不是用户自定义的而是索引记录等。他的缓存是从它自身出发的。
2redis缓存方案redis是内存数据库读取速度十分快因此我们采用redis作为我们的缓冲数据库用来缓存用户定义的热点数据用户直接从缓存中读取热点数据降低数据库的读写压力。而MySql是主要作为数据的落盘。
3提升MySql访问性能的方式 1读写分离利用MySql的主从复制我们设置多个从数据库一个主数据库我们进行主从复制的操作然后主数据库主要负责写的操作而其他从数据库负责读的操作。这样读写分离之后会降低主数据库读的压力。但是当碰到对于读的时效性很强的时候我们不得不读取主数据库了。 2连接池我们MySql中存在连接池的组件会开启多个线程去服务这几个连接。有了连接池可以大大提高并发访问数据库的能力。并且网络模型为select 阻塞IO模型。我们当开启事务的时候我们要保证这事务中的sql语句全部在一个线程中执行。 3异步连接可以采用非阻塞IO的方式也就是异步方法。 4热点数据的读写策略redis 1安全为主 如果要以安全为主我们就要避免主数据库和从数据库读取的数据不同的问题。当我们先写入MySQL后必然会出现MySQL与Redis数据不同的问题那么我们就不能先写入MySQL。而是要先删除Redis中的数据然后再写入MySQL最后将MySQL中的数据同步到Redis中去这样就保证两方的数据一致了。但是我们的缓存方案就是为了提升效率现在却为了安全而降低了效率这是我们不愿看到的。 2速度为主 如果要以效率为主我们可以先写入缓存并且设置过期时间大约是200毫秒然后再写入MySQL当写入MySQL后我们再将MySQL中的数据同步到Redis中去。当同步到Redis中去的时候这个过期时间也就到期了。过期时间是与MySQL网络传输时间MySQL处理时间MySQL同步到Redis的时间。有个问题是如果当写入MySQL写入失败这个时候Redis中含有数据那么他就会提供脏数据。但是这个问题也就200毫秒的存活时间因为从数据库会找主数据库进行同步。 5缓存问题的解决方法
1缓存穿透 问题如果黑客让客户端一直读取MySQL和Redis中都不存在的数据那么所有的读取操作都落在了MySQL中那么就会造成MySQL中访问的性能急剧降低。 解决如果在Redis和MySQL中读取的数据都不存在那么就在Redis中设置一个Key,nil代表查找的这个热点数据不存在。或者部署布隆过滤器类似于哈希表使这些数据只能增加不能删除具体可以搜一搜。 2缓存击穿 问题如果Redis中没有但是MySQL中有也就是说本来一个热点数据在Redis中存在但是过期了那么大量的并发请求读取操作就会落到MySQL中这样就造成MySQL访问的性能急剧降低。 解决我们可以将过热的数据设置成不过期的状态。或者是添加分布式锁将并发的请求操作变成串行执行。 3缓存雪崩 问题我们在写入Redis中的数据是需要加入过期时间的但是当我们不小心将多个过热数据的过期时间设置成统一时间就会面临大量热点数据集中失效的问题虽然失效但是在MySQL中还是存在这个数据所以大量的请求读取操作就会落到MySQL中去就会造成MySQL访问性能急剧降低。 解决我们可以将这个过期时间给错开避免同时过期。当然我们可以在重启MySQL的时候先将一些热数据先缓存到Redis中。 五一些小问题
1MySQL的集群是用什么样的方式去增加并发量
使用连接池技术合理使用索引优化SQL语句分库分表使用存储过程。
2B树和B树的区别 1.B树只适合随机检索B树支持随机检索和顺序检索 2.B树空间利用率高可以减少IO次数磁盘读写代价更低。 一般来说索引本身也很大往往以索引文件的形式存储在磁盘上这样索引查找过程就要产生磁盘IO消耗。B树的内部节点只作为索引使用其内部节点非叶子节点比B树更小判断能容纳的节点中关键字更多一次读取到的键更多。 3.B树查询效率更稳定因为数据存放在叶子节点。 4.B树在一定程度上也提高了磁盘IO性能但没有解决遍历效率低下的问题。B树的叶子节点都使用指针顺序连接在一起只要遍历叶子节点就可以实现所有值。 5.增删文件时B树需要重新调整树结构。B树不需要调整树结构因此B树效率更高。 3数据库的ACID怎么实现 1原子性要么都发生要么都不发生所以需要实现回滚的操作那么我们就要实现undolog的回滚日志。我们在数据库执行操作的时候我们生成一个undolog里面包含的是数据库的SQL当执行失败的时候我们通过我们的undolog进行回滚也就是当插入insert的话那我们就执行delete如果是update那我们就反向执行update。反正就是通过undolog进行回滚操作。 2一致性是数据库的完整性和一致性我们使用其他三个特性来完成这一个特性。 3隔离性对于隔离性需要实现MVCC 4持久性对于持久性就是我们实现redolog我们采用预先写的方法也就是我们在修改之前先将操作写入日志然后再写入bufferpool这样mysql宕机之后的话我们重启就可以读取到redolog的数据。 4mysql的binlog是什么
binlog是二进制日志他记录了数据库上的所有改变并以二进制的形式保存在从磁盘中。它可以用来查看数据库的变更历史数据库增量备份和恢复mysql的主从数据库的复制。 5 当前读和快照读
当前读像select lock in share mode select for update ,update ;insert; delete 。这些操作都是一种当前读为什么叫当前读就是他读取的是当前记录的最新版本读取时还要保证其他事务不能修改当前记录所以会对记录进行加锁。
快照读像不加锁的select就是快照读。快照读的实现是基于MVCC的操作实现的他的操作避免了加锁的操作只是拿取一个数据版本。
6数据库锁
在MySQL中锁可以分为共享锁和排它锁两种类型。共享锁用于读取数据而排它锁用于修改数据。当一个事务获得了排它锁后其他事务就不能再对该数据进行修改直到该事务释放锁为止。
7项目怎么进行死锁检测
可以使用jstack工具
或者写死锁检测的代码Linux下的死锁检测组件分模块讲解_linux死锁检测-CSDN博客
8什么时候使用读已提交 读已提交是一种常见的隔离级别它可以提高并发性和数据准确性订单系统 假设有一个在线商店它需要处理大量订单。多个用户可能同时提交订单如果不使用读已提交隔离级别有可能会出现数据混乱或错误的情况。例如一个用户提交订单时第二个用户同时查看订单但却看到了已提交但未完成的订单导致订单重复或缺失。使用读已提交隔离级别可以避免这种情况确保每个用户都只看到已经提交并生效的订单。
9搜索慢怎么解决 我们通过使用 EXPLAIN 来查看 SQL 语句的具体执行过程。 原理模拟优化器执行 SQL 查询语句从而知道 MySQL 是如何处理 SQL 语句的。 首先我们需要找到SQL这个语句在哪里通过 show processlist 列出较慢的连接通道来 以及使用慢查询日志来找到具体的SQL语句。再分析SQL中我们要先查看在where、group by、order by中是否使用索引如果没有使用那么就可以考虑是否添加索引然后继续优化SQL语句中in和not in 变成联合查询并且减少整体的联合查询。以及一个隐形的问题age问题应该存储出生年月让客户端进行计算年纪。 https://github.com/0voice