• 微信:
  • hai764003
  • QQ:
  • 511211014
  • E-mail:
  • jaquery@163.com

案例总数51

访问总数312385

收藏总数310916

MySQL数据库优化返回列表

上传时间:2015-02-02 内容关键字:MySQL数据库优化


分析:

关键字:商品名称。 作为该表的唯一标识。其他的全都是非关键字,而非关键字分类则必 须依赖商品名称而和其一一对应,而非关键字分类描述必须依赖分类何其一一对应,所分类描述商品名称就存在了传递函数依赖。所以上述表不符合第三范式。


不符合第三范式的表存在下列问题:


1.数据冗余:

(分类、分类描述)对于每一个商品都会进行重复记录

2.数据的插入异常。

如果插入多列,那么分类和分类描述也要多次重复操作,或者找不到新分类的描述。

3.数据的更新异常。

如果我们想更新饮料的分类描述,那么所有行的分类描述的一个个去挨着修改。

4.数据的删除异常。

比如我们把所有的饮料都删除以后,那么饮料这个分类被删除,而不知道这个表中是否 有饮料这个分类了。


对上面不符合第三范式的表进行改进


三、表的反范式化:


反范式化是指为了查询效率的考虑把原本符合第三范式的表适当的增加冗余,以达到优化查询效率的目的,反范式化是一种以空间来换取时间的操作。

思考:如何查询订单信息?

SELECT b.用户名, b.电话,b.地址,a.订单ID,SUM(c.商品价格*c.商品数量) as 订单价格

FROM ‘订单表’ as a

JOIN ‘用户表’ b ON a.用户ID = b.用户ID

JOIN ‘用户商品表’ c ON c.订单ID = b.订单ID

GROUP BY b.用户名, b.电话,b.地址 ,a.订单ID


分析:该SQL因为必须连接多个表而无法进行再次SQL优化,但是可以进行反范式优化,如下:

优化后的SQL语句:

SELECT a.用户名,a.电话,a.地址,a.订单IDa.订单价格 FROM 订单表 a;



四、表的垂直拆分:


所谓的垂直拆分,就是把原来一个有很多列的表拆分成多个表,这解决了表的宽度问题。通常垂直拆分可以按以下原则进行:


1.把不常用的字段单独存放到一个表中

2.把大字段独立存放到一个表中

3.把经常一起使用的字段放到一起



五、表的水平拆分:


表的水平拆分是为了解决单表数据量过大的问题,水平拆分的表每一个表的结果都完全一致的。


常用的水平拆分方法:

1.id进行hash运算,如果要拆分成5个表则使用mod(id ,5) 取摹0-4个值

2.针对不同的hashID把数据存到不同的表中。

挑战:

1. 跨分区表进行数据查询

2. 统计及后台报表操作。

建议:

1.前台效率考虑,使用拆分后的表。后台方便考虑,只用总表。

2.由于使用算法复杂,一般不建议使用,可以使用其他方法来代替。


第五章:系统配置优化


数据库时基于操作系统的,目前大多数MySQL都是安装在LINUX系统之上,所以对于操作系统的一些参数配置也会影响到MySQL的性能,下面就列出一些常用的系统配置。


 

小海哥推荐你看: 博客园  php教程分享网站  phpmywind  脚本之家