设为首页 加入收藏

TOP

MySQL数据库优化(二)
2015-07-24 10:19:50 来源: 作者: 【 】 浏览:1
Tags:MySQL 数据库 优化
学生做过的题都记录在这个表里,包括对题和错题。每个题会对应一个或多个知识点,我们需要根据错题来分析学生在哪个知识点上掌握的不足。这个表很容 易达到千万级,迫切需要拆分,那么根据什么来拆呢?从需求上看,无论是老师还是学生,最终会把焦点落在一个学生的身上。学生会关心自己,老师会关心自己班 的学生。而且每个学科的知识点是不同的。所以我们很容易想到,联合学科和知识点两个字段来拆分这个表。这样拆下来,每个表大概2万条数据,检索效率非常 高。

 3.对表进行垂直划分

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

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

(2)把大字段独立存放到一个表中;

(3)把经常一起使用的字段放到一起。   

有些表记录数并不多,可能也就2、3万条,但是字段却很长,表占用空间很大,检索表时需要执行大量I/O,严重降低了性能。这个时候需要把大的字段拆分到另一个表,并且该表与原表是一对一的关系。

\

   【试题内容】、【答案信息】两个表,最初是作为几个字段添加到【试题信息】里的,可以看到试题内容和答案这两个字段很长,在表里有3万记录时,表已经占 了1G的空间,在列试题列表时非常慢。经过分析,发现系统很多时候是根据【册】、【单元】、类型、类别、难易程度等查询条件,分页显示试题详细内容。而每 次检索都是这几个表做join,每次要扫描一遍1G的表,很郁闷啊。我们完全可以把内容和答案拆分成另一个表,只有显示详细内容的时候才读这个大表,由此 就产生了【试题内容】、【答案信息】两个表。


4. 选择适当的字段类型,特别是主键

  选择字段的一般原则是保小不保大,能用占用字节小的字段就不用大字段。比如主键, 我们强烈建议用自增类型,不用guid,为什么?省空间啊?空间是什么?空间就是效率!按4个字节和按32个字节定位一条记录,谁快谁慢太明显了。涉及到 几个表做join时,效果就更明显了。值得一提的是,datetime和timestamp,datetime占用8个字节,而timestamp占用4 个字节,只用了一半,而timestamp表示的范围是1970—2037,对于大多数应用,尤其是记录什么考试时间,登录时间这类信息,绰绰有余啊。

  5.文件、图片等大文件用文件系统存储,不用数据库

  不用多说,铁律!!!数据库只存储路径。

  6.外键表示清楚,方便建立索引

  我们都知道,在powerdesigner里为两个实体建立关系,生成物理模型时会自动给外键建立索引。所以我们不要怕建立关系把线拉乱,建立个ShortCut就好了。

  7.掌握表的写入时机

  在库模式相同的情况下,如何使用数据库也对性能有着重要作用。同样是写入一个表,先写和后写对后续的操作会产生很大影响。例如在上面提到的适度冗余里的例子,

\

   我们最初的目的是记录考生的总分,以达到提高检索效率的目的,也就是在录入成绩时写入这个表。在需求里有这样的要求:列出本次考试的所有学生成绩,没有 录入成绩的也显示该学生名称,只是总分显示为空。这个查询就需要用【学生信息】left outer join 【学生考试总分信息】,大家都知道outer join 的效率比join是要低的,为了避免这个问题,我们就在布置考试的时候写入这个表,把所有学生都插入进去,分数都是null,这样一来我们就可以用 join达到这个效果了。而且还有这样的好处:在某次考试中,安排了一个班所有学生考试,所有学生都录入了成绩。现在班里转来一个新生,那么在此时如果查 询学生成绩,就会列出这个新生,结果是未录入成绩,这显然是不对的。如果在安排的时候就写入,就可以记录下该次考试中实际的考生了,这个表的作用,也就不 知是冗余了。

  8.宁可集中批量操作,避免频繁读写

  系统里包含了积分部分,学生和老师通过系统做了操作都可以获得积分,而且积分规 则很复杂,限制每类操作获得积分不同,每人每天每类积分都有上限。比如登录,一次登录就可以获得1分,但是不管你登录多少次,一天只能累积一个登录积分。 这个还是简单的,有的积分很变态,比如老师积分中有一类是看老师判作业的情况,规则是:老师判了作业,发现学生有错的,学生改过了,老师再判,如果这时候 学生都对了,就给老师加分,如果学生还是错的,那就接着改,知道学生都改对了,老师都判完了,才能给老师加分。如果用程序来处理,很可能每个功能都会额外 的写一堆代码来处理这个鸡肋似的积分。不仅编程的同事干活找不到重点,还平白给数据库带来了很大的压力。经过和需求人员的讨论,确定积分没有必要实时累 积,于是我们采取后台脚本批量处理的方式。夜深人静的时候,让机器自己玩去吧。

  这个变态的积分规则用批处理读出来是这样的:  

1 select person_id, @semester_id, 301003, 0, @one_marks, assign_date, @one_marks 2 from hom_assignmentinfo ha, hom_assign_class hac 3 where ha.assignment_id = hac.assignment_id 4 and ha.assign_date between @time_begin and @time_end 5 and ha.assignment_id not in 6 ( 7 select haa.assignment_id from hom_assignment_appraise haa, hom_check_assignment hca 8 where haa.appraise_id = hca.appraise_id and haa.if_submit=1 9 and ( 10 (hca.recheck_state = 3004001 and hca.check_result in (3003002, 3003003) ) 11 or 12 (hca.recheck_state = 3004002 and hca.recheck_result in (3003002, 3003003)) 13 ) 14 ) 15 and ha.assignment_id not in 16 ( 17 select assignment_id from hom_assignment_appraise where if_submit=0 and result_type = 0 18 ) 19 and ha.assignment_id in 20 ( 21 select haa.assignment_id from hom_assignment_appraise haa, hom_check_assignment hca 22 where haa.appraise_id = hca.appraise_id and haa.if_submit=1 23 and hca.check_result in (3003002, 3003003) 24 );

?

  这还只是个中间过程,这要是用程序实时处理,即使编程人员不罢工,数据库也会歇了。

  9.选择合适的引擎

   Mysql提供了很多种引擎,我们用的最多的是myisam,innodb,memory这三类。官方手册上说道myisqm比innodb的读速度要 快,大概是3倍。不过书不能尽信啊,《OreIlly.High.Performance.Mysql》这本书里提到了myisam和innodb的比 较,在测试中myisam的表现还不及innodb。

首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇mysql5.5.17源码安装 下一篇MySQL数据库管理(二)单机环境下..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·C/C++ 类模板与模板 (2025-12-27 01:49:52)
·C语言 模板化<templ (2025-12-27 01:49:49)
·C/C++模板类模板与函 (2025-12-27 01:49:46)
·如何理解c语言指针和 (2025-12-27 01:19:11)
·为什么C标准库没有链 (2025-12-27 01:19:08)