对于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:当当网开发,简单易用,轻量级中间件