`
liuhanjun
  • 浏览: 47232 次
  • 性别: Icon_minigender_1
  • 来自: 海口
社区版块
存档分类
最新评论

mysql性能优化的探讨

    博客分类:
  • J2EE
阅读更多

    最近做的在线考试系统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设计人员帮忙,系统暴丑陋啊,哪位美工兄弟提携提携俺?

分享到:
评论
4 楼 niumd 2011-06-18  
Don’t use ORDER BY RAND() if you have > ~2K records
楼主不听话造成滴
3 楼 魔力猫咪 2011-06-16  
其实是你执行rand() 造成的。因为你使用rand函数排序。那么首先必须全表,第二,所有记录都要计算rand。最后是大排序。当然性能很差。
这个系统的问题在于你数据库开发水平太差了。
2 楼 antonia 2011-06-16  
美工不可或缺啊
1 楼 ak121077313 2011-05-13  
order 是有问题,不知道mysql是怎么想的,试卷静态化是怎么做的??生成html?freemark?

相关推荐

    Mysql查询优化详解(含示例)

    本文深入探讨了MySQL查询优化的多种策略和技巧,旨在帮助数据库管理员和开发人员提升MySQL数据库的性能。首先,介绍了使用EXPLAIN命令分析查询执行计划的重要性,以便识别潜在的性能瓶颈。接着,详细阐述了索引优化...

    MySQL优化之索引选择性-并不是所有字段都适合加索引

    需要了解MySQL性能优化的软件工程师。 数据库性能调优相关的技术培训学员。 适用场景及目标: 适用于准备技术面试、进行数据库性能诊断与优化的场景。目标是帮助开发者理解,在MySQL性能调优中,除了常规的索引...

    Mysql查询优化从入门到入土详解含示例(值得珍藏)

    本文通过详细的示例和说明,深入探讨了MySQL查询优化的重要性及其实现方法。我们介绍了查询优化技术的各个方面,包括索引、查询语句、表结构等基本优化方法以及高级优化技术如查询缓存、数据库分区、使用覆盖索引和...

    MySQL进阶:优化查询性能与高可用性的实践

    MySQL进阶:优化查询性能与高可用性的实践 随着互联网技术的快速发展,数据量呈现爆炸式增长,数据库作为存储和管理数据的关键工具,其性能和稳定性对...本文将从查询优化、高可用性两个方面,探讨MySQL的进阶实践。

    Oracle数据库性能优化的艺术 (文平) 高清PDF扫描版

    《oracle数据库性能优化的艺术》重在“授人以渔”,虽然主要内容是围绕oracle数据库系统展开的,但是书中的观点同样适用于db2、sql server、mysql、postgresql等数据库系统。 oracle数据库性能优化的艺术 目录 ...

    [高性能MySQL(第3版)].Baron.Scbwartz等.扫描版

    说到经验丰富,本书的作者已经在MySQL性能领域工作多年,从MySQL还没有什么可扩展性和可测量性的时代,直到现在这些方面已经有了长足的进步。而说到合理的方法,他们简直把这件事情当成了科学,首先定义需要解决的...

    MySQL大表优化方案探讨

    当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化:除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑、部署、运维的各种复杂度,一般以整型值为主的表在千万...

    MySQL数据库的优化与应用

    首先,文章介绍了索引优化、查询语句优化和分区表等技术手段,可以帮助提高MySQL数据库的性能和效率。其次,文章探讨了MySQL在Web应用程序、企业级应用和嵌入式系统等领域中的应用情况,为这些应用场景提供了强大的...

    基于机器学习的查询优化研究.docx

    此外,本文还介绍了基于 MySQL 的数据库查询性能优化技术,包括索引、查询优化器、缓存等方面的研究。索引是一种用于快速检索数据的结构,通过索引可以大大提高查询速度。在 MySQL 中,主要有两种类型的索引:B-Tree...

    MySQL DBA 数据库工程师实战经验

    4. **性能优化**:分享数据库性能分析和优化的实战技巧,包括索引设计、查询优化、数据库调优等。 5. **实战案例分析**:通过具体的案例分析,展示如何应用MySQL DBA的知识和技能解决实际问题。 6. **自动化与工具...

    黑马Mysql教程入门+进阶PDF (超详细,覆盖面全)

    随后,我们将深入探讨 MySQL 的存储过程。存储过程是一组预编译的 SQL 语句集合,可以在数据库中进行重复性操作。我们将学习如何创建、调用和管理存储过程,以及存储过程在提高数据库效率和性能方面的应用。 另外,...

    【mysql开发】简单教程

    - **性能优化**:介绍索引的使用、查询优化技巧,以及如何提高数据库性能。 - **存储过程和函数**:讲解如何编写存储过程和自定义函数来封装数据库逻辑。 - **权限管理**:指导如何创建用户、分配权限和管理用户权限...

    MySQL查询语句过程和EXPLAIN语句基本概念及其优化

    我们知道MySQL的性能优化方法,一般有建立索引、规避复杂联合查询、设置冗余字段、建立中间表、查询缓存等,也知道用EXPLAIN来查看执行计划。 但对MySQL复杂查询语句执行过程和内部机制,MySQL Optimizer本身所做...

    MySQL面试题整理(面试题+参考回答),2024最硬核

    这份资料不仅包括了对MySQL基础知识的深入探讨,还涵盖了一些高级主题,如性能优化、复制和分片等。 这份资料适用于所有正在寻找数据库相关职位的学生和工作人员,无论是校招还是社招。对于那些正在准备面试的学生...

    MySQL分区表:万字详解与实践指南

    在处理大型MySQL数据库时,分区表是一种强大的功能,可以提高查询性能、管理大量数据以及优化备份和恢复过程。本文将深入探讨MySQL分区表的概念、类型、优势,并通过实际示例展示如何在不同的场景下应用分区表。 ...

    为什么说MySQL单表数据不要超过500万行

    具体情况大概是这样的,当年的 DBA 测试 MySQL性能时发现,当单表的量在 2000 万行量级的时候,SQL 操作的性能急剧下降,因此,结论由此而来。然后又据说百度的工程师流动到业界的其它公司,也带去了这个信息,所以...

    计算机毕业设计:基于 ssm mysql-高校在线请假与审批系统(数据库+程序+论文),保证可靠运行,附赠计算机毕业论文

    同时,我们还对系统进行了压力测试和性能优化,确保在高并发场景下仍能稳定运行。 此外,我们还撰写了详细的毕业论文,对项目的需求分析、系统设计、实现过程等方面进行了深入剖析,并探讨了相关技术的前沿动态和...

    计算机毕业设计: 基于ssm mysql-中小型超市管理系统 (数据库+程序+论文),保证可靠运行,附赠计算机答辩PPT 

    此外,我们还对系统进行了性能优化和安全性保障,确保在高并发场景下仍能稳定运行,并有效防止数据泄露和非法访问。 为了支撑项目的完整性和学术性,我们撰写了详细的论文,深入分析了中小型超市管理的现状和挑战,...

Global site tag (gtag.js) - Google Analytics