mysql
Key~美好的每一天
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
b树和b+树的区别?MySQL为什么选择b+树作为索引结构?
2.范围查询效率更高:b+树只有叶子节点存储数据,并且节点之间通过双向链表连接,那么在范围查询时,只需要查询到一个数据,然后遍历链表就行;而b树需要查询范围内的所有数据。b+树是b树的变形树,和b树的区别是它只有叶子节点存储数据,并且叶子节点间通过双向链表连接,非叶子节点用来存放索引,而b树所有节点都要存放索引及数据。1.减少磁盘io:由于b+树非叶子节点不存储数据,所以一个节点可以存储更多索引,那么在相同的 高度下,b+树的索引数量就要多于b树,也就可以减少磁盘io。原创 2025-02-27 16:14:52 · 507 阅读 · 0 评论 -
MySQL如何定位慢查询?
慢查询指查询耗时较长的查询,可能原因是多表查询,单表数据量过大,未经过索引,聚合查询等等,mysql自带慢日志,我们可以通过慢日志定位到慢查询sql。long_query_time=2 表示记录慢查询的时间,也就是超过2秒的查询会被记录到慢查询日志中。慢查询日志位于/var/lib/mysql/localhost-slow.log。slow_query_log =1 表示开启慢查询日志。里面记录了慢查询的sql,以及查询用时。原创 2025-02-27 11:14:34 · 286 阅读 · 0 评论 -
聚集索引、非聚集索引和覆盖索引
比如:select * from tb where name = ’张三‘ ,假设name是建立了索引的,这个sql就需要进行回表查询,因为name是二级索引,叶子节点只存放了主键,是无法得到整行的数据的,所以需要通过主键id回表查询得到整行的数据。比如:select id,name from tb where name = ’张三‘,这就是覆盖索引,因为name索引的叶子节点存放了name(作为索引)和主键id,能不回表直接查询到返回的列(id,name)。非聚集索引(二级索引):叶子节点存储主键。原创 2025-02-27 15:47:30 · 297 阅读 · 0 评论 -
事务的四大特性和隔离级别
不可重复读:一个事务中先后两次读取同一条记录,但是在这期间这条记录被另一个事务更改了,那么这两次读取出来的数据就是不同的,这称为不可重复读。脏读:一个事务去改变了数据,但这个事务还未提交,这个数据却被另一个事务读到了,那么这个数据就是脏数据,因为事务是有可能回滚的,这就是脏读的问题。事务的隔离级别是由小到大分别是读未提交,读已提交,可重复读,串行化,它们是为了解决并发事务的脏读,不可重复读,幻读的问题。隔离性:并发事务之间是隔离的,互不影响的,这与事务的隔离级别有关。原创 2025-03-03 09:58:51 · 153 阅读 · 0 评论 -
redo log和undo log是什么?
而引入了redo log后可以解决这个问题,当我们增删改时,会先操作buffer pool,然后redo log buffer会把这些数据记录下来,然后马上写到磁盘中的redo log日志文件中,这样之后数据从buffer pool同步到磁盘中时就算发生了错误,也可以从redo log日志文件中恢复。当我们对数据库进行增删改操作时,会先去操作内存中的buffer pool(缓冲池),然后再刷到磁盘当中,如果刷盘的过程中数据库宕机了,那么内存中的数据是有可能丢失的。原创 2025-03-03 12:31:09 · 363 阅读 · 0 评论 -
MySQL的MVCC机制
简单来说就是判断当前事务id是否在活跃事务id集合中,如果在就说明当前事务为提交,此版本的数据不可见;如果当前事务id小于活跃事务id集合的最小id,就说明当前事务已经提交了,该版本的数据是可见的;如果当前事务id是大于等于预分配的事务id,也就是当前事务是此Read View生成后的未来事务,那么也是不可见的。快照读在读取时不会加锁,是乐观锁的态度,依靠MVCC来进行并发控制,也就是使用普通的select语句,可能会读到历史数据。头部是最新的数据,尾部是最旧的数据。原创 2025-03-03 15:47:10 · 227 阅读 · 0 评论 -
mysql主从同步原理
mysql主从同步依靠的是bin log(二进制日志),在主库的DML和DDL语句会存到bin log中,然后主库会和从库建立连接,将binlog日志发给从库,从库接受到后存入到中继日志中,之后再执行中继日志中的sql语句,从而实现主从同步。原创 2025-03-03 16:08:33 · 194 阅读 · 0 评论 -
缓存与数据库的双写一致性问题
先删缓存再更新数据库出现问题的情况,是在删除缓存和更新数据库之间有其他的线程来查询缓存,是在写缓存和写数据库之前插入了查询缓存和数据库的操作,我们知道写操作一般是要比查询操作要慢的,所以是有概率出现这种情况的。线程1去删除缓存并更新数据库,更新数据库还未完成这期间,线程2来查询缓存未命中,于是去查询数据库的旧数据,并且把旧数据写入了缓存,最后线程1去更新了数据库,这样就导致了数据库和缓存数据的不一致。先删除缓存,再更新数据库,延迟一段时间后,又去删除缓存,这样可以将旧缓存删掉,保证最钟一致性。原创 2025-03-06 14:37:09 · 1526 阅读 · 0 评论 -
索引的设计原则
3.对于区分度越高的列,建立索引的效果越好。对于唯一的列,索引效果最佳;如果有多个重复值的列,索引效果不好。1.where、order by、group by后的字段,还有join时的连表条件的字段适合建立索引。4.区分度最高的列放在联合索引的最左侧,更频繁使用的列放在联合索引的左侧。2.不要给每个列单独建立索引,尽量使用联合索引。5.对于较长的索引列,可以使用前缀索引。6.单表的索引数最好不要超过5个。原创 2025-03-21 10:31:40 · 148 阅读 · 0 评论 -
Mysql的锁
表级锁:锁住一整张表,针对非索引字段加的锁,sql没有用到索引就会使用全局锁,性能较低。行级锁:针对索引字段加的锁,会锁住一行记录,并发性能高。全局锁:锁住一整个库,让数据库处于只读状态,一般在数据备份时用到。当update、delete的时候没有命中唯一索引或者索引失效,会走全表扫描加上表锁,性能很低。原创 2025-03-23 11:16:55 · 329 阅读 · 0 评论 -
Mysql中各种连接的区别
left join会返回左表的数据,以及右表匹配的数据,不匹配的数据会显示为null。内连接:通过inner join连接两个表,返回两个表中的匹配的数据,不匹配的不显示。right join右表的所有数据,以及左边匹配的数据,不匹配的数据显示为null。外连接:主要分为左连接(left join)和右连接(right join)。原创 2025-03-24 18:32:08 · 300 阅读 · 0 评论
分享