mysql数据库的优化
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql数据库的优化相关的知识,希望对你有一定的参考价值。
- 表的设计符合三范式
- 每一列属性都是不可分割的属性值,确保每一列的原子性
学生编号 姓名 性别 联系方式
20080901 张三 男 email:[email protected],phone:88886666
20080902 李四 女 email:[email protected],phone:66668888以上的表就不符合,第一范式:联系方式字段可以再分,所以变更为正确的是:
学生编号 姓名 性别 电子邮件 电话
20080901 张三 男 [email protected] 88886666
20080902 李四 女 [email protected] 66668888 - 每个非主属性是由整个主键函数决定的,而不能由主键的一部分来决定,是消除部分依赖。第二范式可以减少插入异常,删除异常和修改异常
例如(学生选课表):
学生 课程 教师 教师职称 教材 教室 上课时间
李四 Spring 张老师 java讲师 《Spring深入浅出》 301 08:00
张三 Struts 杨老师 java讲师 《Struts in Action》 302 13:30这里通过(学生,课程)可以确定教师、教师职称,教材,教室和上课时间,所以可以把(学生,课程)作为主键。但是,教材并不完全依赖于(学生,课程),只拿出课程就可以确定教材,因为一个课程,一定指定了某个教材。这就叫不完全依赖,或者部分依赖。出现这种情况,就不满足第二范式。
修改后,选课表:
学生 课程 教师 教师职称 教室 上课时间
李四 Spring 张老师 java讲师 301 08:00
张三 Struts 杨老师 java讲师 302 13:30课程表:
课程 教材
Spring 《Spring深入浅出》
Struts 《Struts in Action》 - 数据不能存在传递关系,即没个属性都跟主键有直接关系而不是间接关系
比如Student表(学号,姓名,年龄,性别,所在院校,院校地址,院校电话)
这样一个表结构,就存在上述关系。 学号--> 所在院校 --> (院校地址,院校电话)
这样的表结构,我们应该拆开来,如下。
(学号,姓名,年龄,性别,所在院校)--(所在院校,院校地址,院校电话)
- 每一列属性都是不可分割的属性值,确保每一列的原子性
- 添加适当的索引,索引对数据库查询速度影响很大,必须添加索引,例如:主键索引,唯一索引,普通索引,全文索引
- 添加合适的存储过程,触发器,事务等.
触发器是一种特殊的存储过程,触发器主要是通过事件进行触发而被自动执行的,而存储过程可以通过存储过程名字而被直接调用,触发器的主要作用就是其能够实现由主键和外键所不能保证的复杂的参照完整性和数据的一致性,另外还有强化约束和级联运行的功能。
- 读写分离(主从数据库)
- 对sql语句的优化
- 用具体的字段代替*号,避免全表查询
- 避免where子句中使用!=或<>操作符,这样会进行全表扫描
- 避免where子句中对字段进行null值判断,
- 避免where子句中使用or来连接条件
- like模糊查询也会引起全表扫描,可以考虑全文检索
- in和not in也要避免使用,这样也会引起全表扫描,能用between就不用in了
- 可以用left join 代替子查询
- 分表分区:分表(把一张大表分词多张表),分区(把一张表里面的分配到不同的区域存储)
- 对mysql服务器的硬件升级
以上是关于mysql数据库的优化的主要内容,如果未能解决你的问题,请参考以下文章