最近做的在线考试系统oes,在部署的时候出现些问题,一台几年前的奔D双核PC做服务器,差是差了点,将就吧。但是300人同时在线考试,在进入考试的时候,很多被卡死,进不去,看一眼服务器的CPU占用,mysql占了99%,apache tomcat占了1%,100%!点关机重启都不搭理我。faint,都怪我,以为才几百个并发而已,mysql成名这么久,应该没那么差,所以根本没想着要loadrunner一下压力,这下可好,挂掉了。
既然出了问题,那就分析问题、解决问题吧。试卷是考生进去的那一刹那根据组卷策略随机生成,策略比较灵活,支持难度、知识点、题型、数量等参数,原来的做法是:
select * from table1 left join table2....left join table3....
where ....
order by rand() limit n
每一条策略都执行一个这样的sql,一共有10几条策略,试题库不算大,只有3000多题,抽出题目来后还要一一插入到考生的试卷表,每份试卷大概80多道题,完全随机组卷,每个考生生成的试卷都不一样,300个考生。情况就是这样了,先show profile一下吧,发现瓶颈在上面的那个随机抽题上,再explain一下,出现了filesort,My Gold!
怎么办呢?先想着做多段索引,把mysql的help翻了又翻,不管怎么设置indexs,始终出现该死的filesort。后来发现,多表join查询,只要order by了,貌似是无法消除filesort的。顶你个肺,多表联合查询是必须的,否则要N+1了,那就把order by去掉吧。mysql随机那么慢,不如拿到java的List里面去随机,2、3行代码的事,这下好了,explain一下,没了filesort,show profile一下,I/O耗时成百倍的提高,总效率提高了10倍。既然java运算效率那么高,那就把所有带sortOrder字段的表查询处理下,去掉order by,利用java的collections.sort(....)来排序,只是让bean实现一下comparable接口而已,简单方便。好了,其它优化也做点,基本上是可以用了,不会卡到不动的程度。
但是发现,还是不流畅,硬件上我不可奈何,技术上我已经黔驴技穷,现在只有改变业务流程了。300个学生同时进入考试,每个学生都要执行10几条sql来随机获取试题,然后执行80多条sql插入到试卷明细表,然后再按照试卷模板顺序执行10多条sql取出数据,中间的处理就不说了,这么繁杂的流程,又发生在几乎同一时刻,想不慢都难啊。看来得变化一下,把每个学生的试卷随机查询生成的工作放在前头,安排考试的时候就去做,等到学生过来考试,只需要查询出自己的试卷明细不就行了,好了,说干就干,这下果然有效!
但是,接着但是,还是没有理想中的速度,7000多个考生,试卷明细表有60多万条数据,每个考生从中查询到属于自己的80多条,300个考生并发取,想快还真不容易。算了,祭出最终法宝,静态化!直接提前生成静态html试卷,这下真的是王道啊,配合以牛叉的apache,破烂PC式服务器也焕发了活力,速度那是杠杠di 哟。虽然静态化以后也带来一些麻烦和困扰,但是都是可以处理和克服的,为了速度,就算是牺牲性命也是值得的!
好了,总结一下吧:
1、平时开发的时候多多explain和show profile,尽量优化,最大限度去掉filesort
2、order by是个很扯淡的东东,大数据量的时候禁用
3、不要给数据库太多的压力,多交给java去干吧,因为java很强悍了撒
4、靠技术和硬件解决不了的,可以考虑改变流程和规则,少花钱、多办事要成为座右铭
5、静态化是王道之剑,但是威力太大,会给自己惹麻烦,不得已时大胆为之
BTW:木有UI设计人员帮忙,系统暴丑陋啊,哪位美工兄弟提携提携俺?
分享到:
相关推荐
MySQL性能优化是数据库管理员和开发人员的关键技能,它涉及到如何有效地使用SQL语句、存储过程和函数,以提高数据查询速度和系统整体效率。本手册将深入探讨这些关键领域,帮助你理解并实施最佳实践。 在SQL语句...
MySQL性能优化与架构设计是数据库管理员、开发人员和系统管理员关注的重要领域,因为数据库性能直接影响到应用程序的响应速度和整体用户体验。本资料提供了一个全面的视角,深入探讨了如何优化MySQL的性能并进行有效...
【标题】:“百度mysql性能优化ppt”所涉及的知识点涵盖了MySQL数据库在性能调优方面的多个重要环节。在MySQL性能优化中,我们关注的核心是提升数据处理速度,减少资源消耗,从而提高系统的整体效率。 【描述】:...
本教程将深入探讨MySQL性能优化的各个方面,帮助你理解并实践有效的优化策略。 首先,我们来了解**Mysql执行优化**。MySQL的执行优化主要涉及查询计划的选择、索引的使用以及SQL语句的优化。在数据库操作中,SQL...
### MySQL性能优化关键知识点 #### 一、MySQL简介与历史沿革 MySQL是一个开源的关系型数据库管理系统(RDBMS),最初由瑞典的MySQL AB公司开发。它的轻量级、高效性和低成本特性使其成为互联网上中小型网站的理想...
MySQL性能优化是数据库管理员和开发人员在处理大数据量和高并发场景时的必备技能。本教程将深入探讨如何提升MySQL数据库的性能,确保系统能够高效、稳定地运行。以下是关于MySQL性能优化的一些关键知识点: 1. **...
根据提供的文件信息,我们可以梳理出《高级MySQL性能优化》这一主题涵盖的详细知识点。 首先,从文档的标题《高级MySQL性能优化》来看,这篇文章应专注于为有一定基础的MySQL用户提供进阶性能调优的技巧和策略。这...
"MySQL性能优化与架构设计"这一主题涵盖了数据库的基础知识、性能提升策略以及系统架构的规划与实施,旨在帮助用户从初级到高级全面掌握MySQL的核心技术。 基础篇: 1. 数据库概念:了解数据库的基本概念,如SQL...
MySQL是世界上最受欢迎的开源关系型数据库之一,尤其在处理海量数据时,其性能优化显得尤为重要。本资料"海量数据性能优化.rar"主要聚焦于如何在大数据环境下提升MySQL的运行效率和响应速度,确保系统的稳定性和可...
本文将探讨 MySQL 数据库性能优化的关键因素,包括硬件配置、数据库设计、查询优化等方面,以期提高 MySQL 数据库的性能和响应速度。 一、硬件配置优化 1. 内存:增加服务器内存可以显著提高 MySQL 性能。对于高...
MySQL性能优化是一门深奥的技术,旨在通过调整和调整数据库的配置参数,来提高数据库的性能和效率。《MySQL性能优化权威指南》这本书深入地介绍了如何在实际应用中实现MySQL性能的优化。本书详细讲述了数据库连接池...
MySQL性能优化教程旨在帮助数据库管理员和开发者提升MySQL数据库的运行效率,减少查询延迟,提高系统整体性能。在本文中,我们将深入探讨MySQL的执行优化、数据索引的理解以及执行状态的解析。 首先,MySQL执行优化...
通过对MySQL 5.6版本的性能优化策略进行详细探讨,我们可以看到,性能优化是一个系统性工程,需要从多个维度综合考虑。无论是查询层面的优化、数据库结构的调整还是服务器配置的改进,每一个环节都至关重要。通过...
MySQL性能优化是一个重要的主题,尤其对于处理大量数据的Web网站系统、日志记录系统、数据仓库系统以及嵌入式系统而言。本文将深入探讨MySQL的主要适用场景、存储引擎的细节,以及影响MySQL性能的关键因素。 首先,...
MySQL性能优化是一项系统工程,涉及到数据库设计、SQL编写、存储引擎选择、参数配置等多个方面。通过深入理解MySQL的工作原理并结合实践经验,我们可以显著提升数据库的运行效率,为业务发展提供强大支撑。 以上是...
### MySQL性能优化Workshop——架构与引擎深度剖析 在当今数据驱动的世界中,数据库的性能优化成为了企业关注的焦点,而MySQL作为全球广泛使用的开源关系型数据库管理系统,其性能优化更是备受重视。本次Workshop...
本文将围绕标题“MySQL性能优化技巧1”和描述中的场景,探讨如何解决SQL查询效率低下的问题。 首先,描述中提到的问题是新功能上线后,某些列表查询耗时较长,原因是旧接口的SQL查询涉及多张表且编写不规范,导致了...
性能优化是一个持续的过程,需要根据实际应用场景和数据访问模式不断调整和优化。记住,没有一劳永逸的解决方案,性能优化需要根据具体情况进行定制。 保持MySQL的版本更新,以利用最新的性能改进和安全修复。 MySQL...