设为首页 收藏本站
查看: 736|回复: 0

[经验分享] 一个Web报表项目的性能分析和优化实践(四):MySQL建立索引,唯一索引和组合索引

[复制链接]
发表于 2016-10-24 05:57:06 | 显示全部楼层 |阅读模式
  先大致介绍下项目的数据库信息。
  数据库A:主要存放的通用的表,如User、Project、Report等。
  数据库B、C、D:一个项目对应一个数据库,而且这几个项目的表是完全一样的。
  数据库表的特点
  A中的表:数据量几乎都比较小,比如User表中用户数,顶多也就几百上千。
  B中的表:X/Y/Z 3张表几乎是确定的,Data表中的数据量比较大,几千万到上亿。
  周期性的会加入一大批数据,比如,每月末增加几百万条数据。
  即一般情况下,B中的表只有查询操作,而且特别是Data查询频繁且数据量很大。
  建立索引
  1.为所有的表建立了唯一索引,索引字段是主键id。
  2.考虑到数据库A中表的数据量很小,暂时没有建立组合索引。
  如有可能,对频繁查询的表和字段,后期尝试加入组合索引。
  3.对Data表建立组合索引。
  频繁查询的一条SQL语句
  select from Data where projectId=? and (inputVersion in (201)) and (sideId in (10001)) and (breakId in (?)) and (periodId in (?)) order by id desc;
  建立组合索引的语句
ALTER TABLE Data ADD INDEX data_query_index (projectId,inputVersion,sideId,breakId,periodId);
  建立索引之前,需要花费2.796秒。
  建立索引之后,只需要0.136秒。
  可以说是,大幅度提升了查询效率。
  索引的弊端
  随之而来的问题:如果已经建立了索引,那么批量增加数据的时候,会特别慢。
  一种较快的方法是:批量插入数据之前,先删除索引,提高批量插入数据的效率。
然后,再重新建立索引,提高查询效率。
  1000万条记录,重建5个字段的组合索引需要2到3秒。
  重建索引的问题是,这个过程中,查询会比较慢。
  应对之策:导入数据,重建索引 应该选择 晚上/凌晨等用户较少使用系统的时间段。
  一个建议
用 explain sql;
可以分析sql语句的执行情况,进而对sql语句进行优化。
  天下武功,唯勤不破
  性能优化,以前只是看过一些书,没啥实践经验。
  最近项目需要由我来进行优化,只好硬着头皮一点点去实践。
  网上搜资料、请教同事、请教大牛。
  周末再多看看书,认真复习和学习Linux、MySQL、Tomcat、Redis等一大堆,先侧重系统优化。

  相关阅读
  一个Web报表项目的性能分析和优化实践(一):小试牛刀,统一显示SQL语句执行时间
  一个Web报表项目的性能分析和优化实践(二):MySQL数据库连接不够用(TooManyConnections)问题的一次分析和解决案例
  一个Web报表项目的性能分析和优化实践(三) :提高Web应用服务器Tomcat的内存配置,并确认配置正确
  
原文参见:http://FansUnion.cn/articles/3026

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-290349-1-1.html 上篇帖子: mysql如何指定查询一张表的查询结果,如最后5行记录和最前5行记录 下篇帖子: mysql存储过程,将一个库表字段数据导入别一个库中(步1)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表