MySQL数据库优化
。。复习到了第二天了,今天的注意是数据库优化,一下内容大多都是参考慕课网的教程,加上一些自己的看法。
第一范式
数据库表中的说有字段都是单一属性,不可再分的。这个单一属性是由基本的数据类型所构成的。
概括:列属性是不可再分的
第二范式
数据库中的表不存在非关键字段对任一候选键字段的部分函数依赖。
部分函数依赖是指存在着组合关键字中的某一关键字决定非关键字的情况。
(贼几把绕,还是不要看吧)
概括:不存在部分依赖,如(A,B)->C
第三范式
第三范式是在第二范式的基础上定义的,如果数据表中不存在非关键字段对于任意候选键字段的传递函数依赖则符合第三范式
概括:在第二范式的基础上,不存在传递依赖,如A->B->C
BC范式
在第三范式的基础之上,数据库表中如果不存在任何字段对任一候选关键字段的传递函数依赖则符合BC范式
概括:在第三范式的基础上,主属性内部也不能部分或传递依赖
1.开启Mysql慢查询日志
2.可以使用MySQL自带的mysqldumpslow 分析慢查询日志,也可以自行安装pt-query-digest
3.重点来了—
1.SQL语句的优化
1.max()求最大值的情况,先对要查找的项建立一个索引,因为索引是顺序排列,通过索引的统计信息,很快就会知道最好一个值的情况
2.count(*)相对count(某一列)会把NULL值也统计进去
3.将子查询的方式优化成join方式查询,如果出现一对多的关系可能会出现重复,此时使用distinct去重
4.group by可以通过子查询设计过滤条件
5.对于limit查询,可以可以先使用索引或者主键的列进行order by操作,继续有优化的话,可以记录上次返回的主键,在下次查询时使用主键过滤(要求主键是连续的,如果不连续可以自己建一个列用于查询)
2.索引的优化
1.如何选择合适的列建立索引?
(1)在where从句,group by从句,order by从句,on 从句中出现的列
(2)索引字段越小越好
(3)离散程度大的列放在联合索引的前面
2.使用pt-duplicate-key-checker工具检查重复冗余索引
(比如索引包含主键的)
3.删除不用索引
3.数据结构的优化
1.选择合适的数据类型
(1) 使用可以存下你的数据的最小的数据类型
(2)使用简单的数据类型
(3)尽可能的使用not null定义字段
(4)尽量少用text类型,非用不可时最好考虑分表
2.表的范式化和反范式化
(范式化一般指的是第三范式)
(反范式化是指为了查询效率的考虑吧原来符合第三范式的表适当的增加冗余,以达到优化查询效率的目的,反范式化是一种以空间来换取时间的操作)
3.表的垂直拆分
(1)把不常用的字段单独存放到一个表中
(2)把大字段独立存放到一个表中
(3)把经常一起使用的字段放到一起
4.表的水平拆分
(表的水平拆分是为了解决单表的数据量过大的问题,水平拆分的每一个表的结构都是完全一致的。前台查询用拆分后的表,后台用汇总表)
4.系统配置优化
1.操作系统配置优化
(1)增加tcp支持的队列数
(2)减少断开连接时,资源回收
(3)打开文件数的限制
(4)关闭软件防火墙
2.MySQL配置文件
(配置参数太多了,就先一下缓存池)
3.第三方配置工具
(Person Configuration Wizard)
5.服务器硬件优化
1.推荐选择单核较快的cpu
2.Disk IO优化,如RAIO1+0