六:MySQL-经常使用性能优化

在开发中警用会遇到查询很慢的问题,尤为是当数据量上去的时候,那么咱们就要开始优化咱们的程序or前端

数据表mysql

1:通常针对表结构进行优化,采用中间表算法

2:优化sql,使用索引,sql

3:利用MySQL主从作读写分离数据库

四:采用缓存机制,缓存

5:垂直节分,从实际业务上进行拆分,好比电商网站通常都是广告,你们电,小家电之类的拆开并发

6:水平切分,针对一张表进行节分,这样保证了不会出现一张表太大状况,可是要作好路由规则,如今通常都采用的一致性哈希算法进行路由。分布式

下面挨个分析:函数

1:通常针对表结构进行优化,采用中间表优化

    第一条,针对表结构进行优化,再设计表的时候并非按照数据库三范式,咱们通常采用的是这种的方式设计表,

    第一范式:数据表中的每一行都是不可分割的原子列,

    好比有一个选课的表 Student_Course(studentId, studentName, collegueId, collegueName, courseId, courseName, grade, credit, courseId1, courseName1, grade1, credit1) 
这样子若是增长了新的课程没有可扩展性。
为了知足第一范式,咱们的设计结果不能使用一个courseName而后用,号分割。 没有可读性,查询起来也很麻烦。
只能有重复的行了,Student_Course(studentId, studentName, collegueId, collegueName, courseId, courseName, grade, credit)
这样就须要用联合主键了studentId和courseId决定了一条记录

    第二范式:实体属性彻底依赖于主键关键字。 他要求数据库表中的实例或行必须被惟一区分,为实现他的分区,一般为表加一列,以存储每一个表的惟一标示,这一列通常都是主键列

    就是像上面这种状况使用联合主键的,

(studentId, courseId) -> grade
studentId -> studentName, collegueId, collegueName
courseId -> courseName, credit
会有以下的问题:
数据冗余: 若是一我的选择了N门课,就会形成studentName, collegueId, collegueName,courseName, credit这些都重复n次
更新异常,若是修改了credit,那么须要修改全部记录的,有可能形成同一个课程学分不一样
插入异常,若是新开一门课程,若是没人选修则没法插入
删除异常,若是选修完了,那么课程也一样要删除掉。
修改的办法为修改成三个表
Student(studentId, studentName, collegueId, collegueName)
Course( courseId1, courseName1, credit1)
Student_Course(studentId, courseId, grade)

第三范式: 非主属性对候选关键字没有传递依赖 一对多
studentId-> collegueId -> collegueName 且 collegueId-> studentId(不是一对一) 
Student 这张表有问题, 一样会带来2Nf的那些问题。 能够再单独分离为一个类,变为
Student(studentId, studentName, collegueId)
collegue(collegueId, collegueName)
范式的缺点:范式为了消除冗余列,会增长表数据增长了查询的复杂度,其实能够适当使用冗余列来提升查询速度
优势:节约空间,会提供更丰富的查询选项

所以咱们再设计表的时候要容许必定的冗余列存在。

2:优化sql,使用索引

    1):应该避免select * 这样的操做,由于他是全局检索的

    2):where 和join的字段应该有索引,应当注意的时候,join在主键和外键数据类型相同的时候,若是值同样就更好

    3):在like的时候,若是第一个字符是通配符,那么索引将会失去做用

    4):使用函数的时候,索引会失去做用

    5):少使用!=,由于在这个操做中,索引是失效的

    6):索引应当建在update少的字段上,并且重复数据很少的字段上,这样才会更高效

    7):若是在用order by时候有多个字段,能够考虑使用复合索引

    ...还有不少

索引是有mysql的引擎支持的,所以引擎不一样,索引支持的类型可能就不一样,以InnoDB来讲支持聚簇索引,可是MyISAM只支持全文索引

三:读写分离

    通常业务量上去了,就会作mysql的主从,读写分离,写操做主库,读操做从库,能够最大限度的利用如今资源,

    关于具体操做有不少,有事基于Mybatis的动态数据源切换的,还有阿里的Cobar和Mycat中间件均可以。

四:缓存机制

    如今通常都是使用NoSql数据库做为数据库前端的缓存,通常吧首页,常常用来查询的数据放在缓存中,采用消息机制保证缓存的一直性,同时为了不缓存击穿,能够把一些值存为null

五:垂直切分

    垂直切分就是从业务层次进行考虑,把业务拆分为多个,上面所说经的电商的,广告,小家电,你们电,日化等分库存储,可是这也带来join的问题,没法跨库join,通常是从程序层面去解决,这样优势就是减小了库的并发

六:水平切分

    表级别的切分,这样好处就是不会出现太大的表,表与表之间能够直接join,缺点就是分片规则很差定,分片带来事务也很差解决

你会发如今垂直切分和水平切分的时候都会带俩分布式一致性的问题,还有不一样节点join的问题,此外还有读取排序的问题

所以咱们最好就是采用靠谱的中间件进行,由于那样对开发人员来讲是无感受的,基于mysql的协议,咱们认为就是读一个库,由中间件进行复杂的处理,还有就是能不分的就不分,能不join的就不join

相关文章
相关标签/搜索