mysql

对于MySQL包含 索引,主从复制,sql执行过程,分库分表,锁和事务。

一 索引
索引是什么?

它是B+树是一个多叉平衡查找树,在非叶子节点存储键值和指针,叶子节点存储数据通过链表进行连接方便进行遍历和范围查询,所以它主要为了提高数据查询效率的数据结构。

索引类型

主键索引,唯一索引,组合索引,全文索引,空间索引。

聚族索引:以主键建立的索引。

非聚族索引:非主键建立的索引。

索引覆盖

是指查询的字段全部建立索引,可直接通过索引直接查询返回。

回表:

是指查询的字段不能满足索引覆盖,只能通过主键进行重新查询返回数据。

最左匹配原则:

就是在建立组合索引 a,b,c 查询的时候索引生效 a或者a,b或者a,b,c ,如果b,c则所以失效。

索引失效情况:

1)在使用like进行模糊查询的时候,因为在关键值可以在多个节点出现,所以会导致查询的时候不清楚使用那个节点的值。

2)在sql中使用了函数,会导致所以失效。

3)在sql 中使用了运算符。

4)在sql 使用or进行查询。

不建议建立索引场景

1)列如 男或女这种枚举。

2)对于频繁修改的字段。

3)数据量比较小的场景。

对于B树和B+树的区别(优势)

1.B+树在非叶子节点是进行存储键值和指针,在叶子节点存储数据;对于B树直接将数据存储数据在节点中。

2.B+树的叶子节点存储的数据是通过链表进行关联,所以在支持查询范围;B树在查询的时候是直接查询到对应节点,不支持范围查询。

3.对于B+树的数据结构会使存储是时 比较扁和胖(深度比较小),在查询的时候效率高和速度快。

B+的数据存储数据

1.对于MySQL的存储引擎是使用的InNODB,所以它最小单位是页 16KB。

2.一个节点就是一个最小单位16KB,指针6B和键值ingter 8B 所以16KB/(8+6)B=1170个。

3.一条数据大致1KB那么一页就是 16/1=16条,一个二阶B+树的数据就是1170*16=18720条;一个三阶B+树存储1170*1170*16=21902400条(大致2千万条)。

大表如何添加索引

1.将a表复制新建一个b表。

2.给b建立索引。

3.将a表中数据同步到b表。

4.修改b表名称为a。

如何知道sql语句是否走索引

使用explain关键字执行sql语句,通过sql语句中key可以看到使用索引类型。

二 主从复制
主从复制过程

1.主库将更新事件更新信息到binlog。

2.从库和主库进行连接,从库通知主库进行同步数据。

3.主库接收到从库的消息,通过binlog线程将binlog日志的数据发送给从库。

4.从库通过建立的IO线程将binlog日志的数据进行接受。

5.从库通过建立sql线程将binlog数据同步到数据库中。

三 sql语句执行过程

通过客户端发来一条sql,在执行过程中,首先会通过连接器进行权限验证,连接验证等等,通过验证之后它去缓存中查询,如果有直接返回,如果没有走语句校验器,进行sql词句校验,然后进入sql语句优化器,进行sql的优化,最后通过执行器和存储引擎连接查询,返回查询数据。

四 锁和事务
锁分类

乐观锁(共享锁):假设在俩个线程加锁的时候不会有冲突,如果有冲突则进行重试,直到成功为止;实现方式,通过版本号进行控制,每使用一次给该版本号+1。

悲观锁(独占锁):只能一个线程获取锁,当前线程获取锁之后,其他线程只能进行等待,直到该锁使用完成,其他线程进行获取。

当该线程更新数据 如果是通过主键进行则是行级锁,否则是表级锁。

死锁:俩个线程在获取锁的时候,相互挣抢导致双方都在等待对方释放资源,不能继续进行执行任务。

事务

1.原子性:这个事务在执行过程只能要么成功要么失败。

2.隔离性:a和b俩个事务在执行过程互不影响。

3持久性:在事务执行完毕之后,数据要永久保存在数据库中,不因服务器的宕机数据丢失。

4一致性:假设100元 a账号和b账号转账 但是钱的总和是100,不能多也不能少。

五 分库分表
1.为什么要分库分表

当数据量太多,导致数据存储和查询比较缓慢,不支持现在的业务场景。

2.水平分库和分表

按照一点的策略将数据进行存储到其他的库中或者表中,这个需要数据id是全局唯一ID,例如将 1,3,5奇数数据存储到A库或者A表中,2,4,6数据存储B库或者B表。

拆分策略:1)HASH取模。 2)范围分片 1-1000和1002-2000。 3)按照地理位置分片。

3.垂直分库

将业务表单独拆分为一个单独的数据库进行存储,例如订单表,该表参生数据较多,需要单独存储。

4.垂直分表

将一个较大的表拆分为主表和扩展表。例如主要是要进行频繁的数据更新,二扩展表示记录,不做更新。

5.拆分之后的影响

a.会导致分布式事务的出现。

b.在范围查询的时候产生俩个表进行查询然后将数据进行合并。

c.也会产生分布式ID需求。

6.分库分表的中间件

mycat:适用场景丰富,配置简单,支持读写分离。

sharding-JDBC:当当网开发,简单易用,轻量级中间件

相关推荐
t1987512811 分钟前
使用zip命令在Ubuntu 20.04上进行文件夹压缩
linux·数据库·ubuntu
牵牛老人39 分钟前
聊聊Qt 中的多面手之QVariant 变体类
开发语言·数据库·qt
谷新龙0011 小时前
神奇的bug之docker compose启动mysql失败
mysql·docker·bug
笨手笨脚の1 小时前
Redis 常用配置实践
数据库·redis·配置·spring runner
二川bro2 小时前
国产数据库KingbaseES零基础实战:Oracle兼容功能从入门到精通
数据库·oracle
怀君3 小时前
Flutter——数据库Drift开发详细教程(七)
数据库·flutter
荔枝吻3 小时前
【沉浸式解决问题】Mysql中union连接的子查询是否并行执行
数据库·mysql·union
不许代码码上红3 小时前
【MySQL】MySQL 数据库操作与设计
数据库·mysql·oracle
陆少枫4 小时前
JDBC强化关键_009_连接池
java·数据库·mysql
夜光小兔纸4 小时前
SQL Server 查询所有表数据量
数据库·sql·sql server