你所知道的关系型数据库
关系型数据库分为:关系型数据库和非关系型数据库,关系型数据库有:mysql、SQL Server 、Oracle;非关系型数据库有:redis,memcache,mogodb,hadoop等
你知道关系型数据库的三范式么?(四范式)
首先说一下我的理解三范式:
第一范式(1NF):是数据库列数据的不可分割。
第二范式(2NF):是建立在第一范式的基础上的,必须有主键,也可以理解必须有唯一标识(如:id)
第三范式(3NF):是建立在第二范式的基础上的,为了不必要的额冗余,建立非主关键字的外键
第四范式:简单理解就是通过两张表,能引出第三张表,而这个表是两张表的缩影,也是BC范式,但是又不包含依赖关系。
谈谈mysql 的瓶颈
在我们做项目时,我相信现在大多数都用的MySQL关系型数据库吧,也不排除有些公司有钱,用的Oracle,我们就来谈谈mysql的瓶颈问题。
高并发读写需求
当我们的数据库遇到“双十一”那种高并发的时候,往往达到每秒上万次读写请求,对于传统关系型数据库来说,硬盘I/O是一个很大的瓶颈。
解决办法:集群和分布式。
海量数据的高效率读写
还是拿京东和天猫这种大型电商来做例子吧,他们的商品、用户,等数据量一定是非常庞大的,如果将这些大量数据存入数据库中,当我们查询、插入,做一些基本的操作的时候,将会大大的影响我们速度以及性能问题。这样的就是海量数据的高效率的读写。
解决办法:分表、分库
高扩展性和可用性
在我们web的结构中,数据库是最难进行横向扩展的,当一个应用系统的用户量和访问量与日俱增的时候,数据库却没办法简单的通过添加更多的硬件和服务节点来扩展性能和负载能力的。对于现在我们很多需要提供24小时不间断的服务的网站来说,对数据库系统进行升级和扩展都是很痛苦的。往往需要停机维护和数据迁移。
解决办法:动态添加服务器,防止单点故障,容灾策略。
关系型数据库的优化技术
对关系型数据库的优化原则是先单机再多机
当我们需要优化数据库时,首先做的步骤是:
(1)找出执行效率低的sql 发现问题
(2)找出问题后就是分析慢sql 分析问题
(3)再就是优化 解决问题
定位慢查询的sql
我们使用数据库,实际就是对数据库的CRUD 的操作,发送SQL、服务器执行SQL并返回连接。也就是所有的SQL语句MySQL服务器都能感知到,问题就在于如何从大量的数据中查询执行速度慢的语句给查询出来。这就是定位慢查询
当然,MySQL中之所以能排名靠前也是有它的强大地方,它能帮助我们将所有的SQL语句的结果都记录下来,方便用户查找定位
查询数据库基本状态
1)运行多久
show status like ‘uptime’;
2)CRUD执行次数
show status like ‘%Com_%’
CRUD
show status like ‘%Com_select%’
show status like ‘%Com_insert%’
show status like ‘%Com_update%’
show status like ‘%Com_delete%’
Show session/global status like ‘%Com_select%’
☞ show [session|global] status like … 如果你不写[session|global] 默认是session 会话(指取出当前窗口的执行),如果你想看所有(从mysql 启动到现在),则应该 global。
INNODB
show status like ‘%Innodb_rows%’;
3)查询所有连接数
show status like ‘connections’
4)查看服务器响应的最大连接数
show status like ‘Max_used_connections’
通过查询(工作环境)最大并发连接数可以配置作为我们配置mysql最大连接数的依据。
通常,mysql的最大连接数默认是100, 最大可以达到16384(理论上)。
如何迅速的定位具体的SQL:
这里就简单叙述了
第一步:关闭原有的MySQL服务
第二步:以支持记录慢sql的方式来启动
第三步:设置慢查询时间阈值
第四步:构造慢sql
第五步:到日志文件中找慢sql
这里有一个问题是开启慢查询?
系统中所有sql都执行一遍,才能判断是否有慢sql。什么时候开启能覆盖所有sql执行?
开发者自验:
开发完成后(主要是功能的自测),需要统一打包,统一部署,统一验证。
测试人员测试:
测试人员需要测试所有功能(开启慢sql测试)。
项目上线:
用户用了所有功能(不要开慢sql,因为会影响服务器性能)。
分析sql语句(explain)
根据以下图表显示匹配即可
优化
单机优化
表结构
设计(三范式和反三范式) 存储引擎
索引
索引可以有效的提高查询效率,但是降低插入,修改,删除的效率
把索引的数据以一定的数据结构(B树)存储到了磁盘中
索引操作相关的sql
在哪些列上适合添加索引? ******
较频繁的作为查询条件字段应该创建索引
select * from emp where empno = 1
唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件
select * from emp where sex = '男’
更新非常频繁的字段不适合创建索引
select * from emp where logincount = 1
索引的小技巧:
(1)like
(2)or
(3)多列索引
(4)字符串加''
分表 分库 分区
分表:
水平分: 单表大数据,安装策略分到多张表中
垂直分:大字段,少查询
分区:
操作的用户无感,因为表没变
存储表数据的时候分成了多个文件
分库
水平 : 单表大数据,安装策略分到多个数据库中
垂直 : 按照业务将表分到不同数据库中
sql技巧 -- 索引失效问题
缓存
多机优化
主从同步
搭建两个mysql服务器
windows中模拟
mysql的安装目录
mysql的data目录 C:\ProgramData\MySQL
C:\Program Files\MySQL
拷贝两份,一份改名为master,一份改名为slave
修改配置
开启日志
指定日志文件
该端口,service-id
见文档
修改auto.cnf的UUID
启动两个mysql
安装成windows的服务
net start 启动服务
master:
授权 允许slave访问我
查看master状态
slave:
配置master相关信息
start slave
show status .... 查看从服务器状态
IO SQL 线程是否状态为YES
测试:
主服务器 修改
从服务器 同步更新
以上都是简要复述,关键点的戳。如果还有什么不明白或者有更好的建议,欢迎留言评论