常用的Mysql优化方式
- 服务器硬件,如机械硬盘改成固态硬盘等
- MySql服务器优化,windows系统上跑着跑着就会多垃圾等,装到Linux上比较稳定
- SQL本身优化,关联子查询改为--关联查询(思考,因为关联查询效率高)
- 反范式设计优化
- 索引优化(重点,下篇文章介绍)
关联子查询改为关联查询
- 子查询里面又关联==关联子查询
- 如果是普通的子查询,或者数据量不是很大,则不需要优化
原因:执行子查询时,MYSQL需要创建临时表,查询完毕后再删除这些临时表,所以,子查询的速度会受到一定的影响,这里多了一个创建和销毁临时表的过程。可以使用连接查询(JOIN)代替子查询,连接查询不需要建立临时表,因此其速度比子查询快。
以下是关联子查询
SELECT
a.date_str,
(
SELECT
b.shop_type
FROM
dp_shop b
WHERE
a.shopCode = b.shop_code
) shop_type
FROM
dp_car_copy2 a
查询用时接近4s
改成关联查询后
SELECT
a.date_str,
b.shop_type
FROM
dp_car_copy2 a,dp_shop b
WHERE
a.shopCode = b.shop_code
查询用时仅需0.7秒
反范式设计优化
如果是电商项目,着重于查询效率,此时适当反范式会更好
反范式化是针对范式化而言的,所谓得反范式化就是为了性能和读取效率得考虑而适当得对数据库设计范式得要求进行违反
允许存在少量得冗余,换句话来说反范式化就是使用空间来换取时间
三大范式:
1、数据库中所有字段都具有单一属性原子性
2、要求表中只具有一个业务主键,也就是符合第二范式的表不能存在非主键列只对部分主键的依赖关系
3、指每一个非主键属性既不能部分依赖于也不传递依赖于业务主键,也就是第二范式的继承上加了非主键对主键的传递依赖(不是主键的属性有着说不清的依赖,就是违反))
原来是一张表,因为不满足第一范式,不符合原子性,导致拆分成两张表
原来是两张表,因为不满足第二范式,存在非主键列只对部分主键的依赖关系,使得两张表又得拆分成三张
原来是三张。。。因为减少冗余,使得越来越多的表,进行查询时,关联、inner等使得查询效率低
此时,反范式设计优化产生
表
增加冗余后
查询有关shop_type时,效率增高