数据库
mysql
主从
为何做主从
- 当sql语句需要缩表,导致不能读,那么业务就受阻
- 当做了热备份,就算主库挂了,那么依靠从库也能快速的替换主库
- i/o访问频率增加,单库压力大
主从复制流程
- 主库的更新事件(update,insert,delete)写入binlog
- 主库创建binglog dump thread,把binlog发送到从库
- 从库启动并发起连接到主库
- 从库启动,创建i/o线程,读取主库binlog内容写入relay_log
- 从库启动,创建一个sql线程,从relay_log读取内容,从exec_master_pos位置开始执行读取到的更新事件,并将更新内容写入到从库的表
pxc
什么是pxc
一套开源的mysql高可用集群解决方案
原理
- 传统的主从就是我上面描述的那种,即主写从读,如果主节点因为网络问题没有同步到从节点,那么就出现了数据的不一致,底层是单向同步
- pvx,强一致性,无同步延迟
- 通过事务解决强一致性
性能调优
- 选择合适的存储引擎
我们都知道myisam比innodb快,但是实际的数据操作是很复杂的,所以相应的业务支持也要大,比如事务,锁,innodb就优于myisam。所以我们可以针对相应的表的数据结构或者业务选择合适的引擎,单纯就存储数据业务简单就用myisam。myisam仅仅缓存索引,innodb缓存数据和索引 - 数据尽量从内存读取
innodb_buffer_pool_size
show global status like 'innodb_buffer_pool_pages_%'
Innodb_buffer_pool_pages_data //存池中包含数据的页的数目,包括脏页。单位是page
Innodb_buffer_pool_pages_dirty //缓存池中脏页的数目。单位是page。
Innodb_buffer_pool_pages_flushed //缓存池中刷新页请求的数目。单位是page。
Innodb_buffer_pool_pages_free //剩余的页数目。单位是page。[当这个为0,说明buffer pool已经被用光,需要增大innodb_buffer_pool_size
Innodb_buffer_pool_pages_misc //缓存池中当前已经被用作管理用途或hash index而不能用作为普通数据页的数目。单位是page。
Innodb_buffer_pool_pages_total //页总数目。单位是page。
- 数据预热
数据预热能够提高读取速度。
默认情况,仅仅有某条数据被读取一次,才会缓存在 innodb_buffer_pool。所以,数据库刚刚启动,须要进行数据预热,将磁盘上的全部数据缓存到内存中。 - 不要让数据存到 SWAP 中
- 提高磁盘读写速度
- 充分使用索引
- 直接数据放内存磁盘
连接池
为何使用连接池
- 通常普通的jdbc请求Mysql,请求完成之后mysql链接就会关闭,这样mysql就是单词链接,每次使用都要重复创建关闭,当多个用户频繁此操作,mysql不停的创建销毁,资源的开销大,压力也会增大。连接池就能解决这一问题
- 资源重用
- 更快的系统反应速度
- 新的资源分配手段
- 统一管理,避免数据库连接泄露
原理
数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。当用户第一次获取连接时,会先请求一定数量(初始链接数量)链接池中,并且会记录每个连接的初始(未使用)时间,然后再将链接池中的连接给有需要的用户。当缓冲池中初始连接用完了,链接池会判断所创建的连接数量是否大于最大链接数如果不大于则可以继续创建连接给请求的用户使用(创建的新连接的个数可自己控制,链接池中有相应的增长参数)。如果已经到到最大链接数则当前用户需要等待直到有用户使用完之后关闭连接,这个用户才可以重复使用。当我们开始使用链接池的时候链接池内部就会进行计时(超时时间),每隔空闲链接的存活时间就会对链接池内部的连接进行一次清理。把所有(当前时间 - 链接最后使用的时间 )> 空闲链接的存活时间的连接释放掉。
索引
索引是什么
- 数据库可以理解为一本书,索引可以理解为书的目录章节
索引优点
- 加大数据检索速度
- 避免排序和创建临时表
- 将随机io变为顺序Io
- innodb支持行级锁,可以让查询锁更少的元组,提高了表访问并发性
缺点
- 创建维护耗费时间,数据越多,时间越长
- 占用物理空间
- 增删改,索引动态维护,降低了维护速度
- 数据量小,索引反而降速
应该创建索引的咧
- 经常需要搜索的列
- 作为主键的列【通常主键本来就是索引】
- join的外键
- (< , <= , = ,> , >= , between,in)进行搜索的列上,因为索引已经排序,指定的范围是连续的
- 经常需要排序的列
- where 条件列
不该创建索引的列
- 很少使用的列
- 数据少,数值重复的列
- text imafe bit数据类型
- 当前列修改性能要求远高于检索时
监控
sql调优
- 慢查询日志找到sql
- slow_query_log 是否启动查询慢日志,默认不启动
- slow_query_log_file 指定日志存放路径
- long_query_time 指定阈值,即查询时间大于多少即为慢日志
- log_queries_not_using_indexes 是否记录未使用索引的sql
- 实时获取性能问题sql
show full processlist - 使用explain分析
id | type | key | extra |
---|---|---|---|
表示mysql执行顺序。id越大越先执行 | 表示找到数据行的方式 | 实际使用的索引 | 额外信息 |
数据备份
目的
- 备灾
- 需求改变
- 测试
备份类型
- 冷备 关闭mysql
- 温备 服务在线,仅支持读,不允许写
- 热备 不影响业务
mongoDB
是什么
基于分布式文件存储的数据库,c++编写,介于关系和非关系型数据库之间的产品
默认端口 27017
特点
- 记录为文档类型,类似于json.
- 多个文档组成集合,多个集合组成数据库
LDAP
什么是ldap
目录数据库。
优势
读取速度非常快,写性能差
php
php7新特性
- 速度优于Php5
- 低内存消耗
- 标准类型声明,可以强制执行参数和返回类型
- 异常处理优化
- 删除了不推荐使用的sapi和扩展
- 返回类型和数量类型声明
- 支持匿名添加
php8新特性
- 命名参数传参的时候可以跳过可选参数
- 构造方法括号中初始化对象属性,并指定属性的权限
- 可以同时指定形参的多种类型
- match 表达式,有些情况下能替换switch
- 内部函数一致类型错误,以前只是警告
- 注解
控制反转
什么是控制反转/依赖注入
- 是一种设计原则,用来减轻代码的耦合度
- 常见方式------依赖注入
- 简单说就是,A类把自己的控制权交给另外一个B类。之间的依赖由这个B类去解决
控制反准IOC 不需要自己内容修改,外部传递 从依赖内部改为依赖外部
依赖注入 DI 不是由自己内部new对象或者实例,而是通过外部构造函数或者方法传入调用其他类
反射
类的实例化由make来创建
容器
把各种类创建放在一个闭包中,闭包的好处是使用时再创建(懒加载)
服务提供者
- 服务提供者是食物,容器是篮子,服务提供者注册到容器。相当于把食物放到篮子里
- 使用场景:可以借助一个容器,提前把 log,user 都绑定到 Ioc 容器中。User 的创建交给这个容器去做。比如下面这样的,你再任何地方使用 login。都不需要关心是用什么记录日志了,哪怕后期需要修改只需要在 ioc 容器修改绑定其他记录方式日志就行了。
门面 facade
- 使用 Facades 其实最主要的就是它提供了(1)简单,易记的语法,从而无需手动注入或配置长长的类名。此外,由于他们对PHP静态方法的独特调用,使得(2)测试起来非常容易。
- Facade核心实现原理就是在 UserFacade 提前注入 Ioc 容器。
使用场景:需要 i o c − > m a k e ( ′ u s e r ′ ) 才 能 拿 到 U s e r 的 实 例 , 再 去 使 用 ioc->make('user')才能拿到User的实例,再去使用 ioc−>make(′user′)才能拿到User的实例,再去使用user->login();那能不能更方便点,用这种方式:UserFacade::login();
步骤:
(1)定义一个服务提供者的外观类,在该类定义一个类的变量,跟 ioc 容器绑定的 key 一样;
(2)通过静态魔术方法__callStatic 可以得到当前想要调用的 login;
(3)使用 static::$ioc->make(‘user’);