记录一次MySQL两千万数据的大表优化解决过程,提供三种解决方案
副问题[/!--empirenews.page--]
题目概述行使阿里云rds for MySQL数据库(就是MySQL5.6版本),有个用户上网记录表6个月的数据量近2000万,保存最近一年的数据量到达4000万,查询速率极慢,一般卡死。严峻影响营业。 题目条件:老体系,其时计划体系的人或许是大学没结业,表计划和sql语句写的不只仅是垃圾,的确无法直视。原开拓职员都已去职,到我来维护,这就是传说中的维护不了就跑路,然后我就是掉坑的谁人!!! 我实行办理该题目,so,有个这个日记。 方案概述
以上三种方案,按次序行使即可,数据量在亿级别一下的没须要换nosql,开拓本钱太高。三种方案我都试了一遍,并且都形成了落地办理方案。该进程心中慰问跑路的那几个开拓者一万遍 :) 方案一具体声名:优化现有mysql数据库跟阿里云数据库大佬电话雷同 and Google办理方案 and 问群里大佬,总结如下(都是英华):
1、数据库计划和表建设时就要思量机能 mysql数据库自己高度机动,造成机能不敷,严峻依靠开拓职员手段。也就是说开拓职员手段高,则mysql机能高。这也是许多相关型数据库的通病,以是公司的dba凡是人为巨高。 计划表时要留意:
索引
简言之就是行使吻合的数据范例,选择吻合的索引 选择吻合的数据范例 (1)行使可存下数据的最小的数据范例,整型 < date,time < char,varchar < blob (2)行使简朴的数据范例,整型比字符处理赏罚开销更小,由于字符串的较量更伟大。如,int范例存储时刻范例,bigint范例转ip函数 (3)行使公道的字段属性长度,牢靠长度的表会更快。行使enum、char而不是varchar (4)尽也许行使not null界说字段 (5)只管罕用text,非用不行最好分表 # 选择吻合的索引列 (1)查询频仍的列,在where,group by,order by,on从句中呈现的列 (2)where前提中<,<=,=,>,>=,between,in,以及like 字符串+通配符(%)呈现的列 (3)长度小的列,索引字段越小越好,由于数据库的存储单元是页,一页中能存下的数据越多越好 (4)离散度大(差异的值多)的列,放在连系索引前面。查察离散度,通过统计差异的列值来实现,count越大,离散水平越高: 原开拓职员已经跑路,该表早已成立,我无法修改,故:该语言无法执行,放弃! 2、sql的编写必要留意优化
原开拓职员已经跑路,措施已经完成上线,我无法修改sql,故:该语言无法执行,放弃! 引擎引擎 今朝普及行使的是MyISAM和InnoDB两种引擎: MyISAM MyISAM引擎是MySQL 5.1及之前版本的默认引擎,它的特点是:
InnoDB InnoDB在MySQL 5.5后成为默认索引,它的特点是: 1.支持行锁,回收MVCC来支持高并发 2.支持事宜 3.支持外键 4.支持瓦解后的安详规复 5.不支持全文索引 总体来讲,MyISAM得当SELECT麋集型的表,而InnoDB得当INSERT和UPDATE麋集型的表 MyISAM速率也许超快,占用存储空间也小,可是措施要求事宜支持,故InnoDB是必需的,故该方案无法执行,放弃! 3、分区MySQL在5.1版引入的分区是一种简朴的程度拆分,用户必要在建表的时辰加上分区参数,对应用是透明的无需修改代码 (编辑:河北网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |