mysql 千万量级的表的优化
参考:
一 大的优化方向: 数据结构优化,慢查询优化,索引优化,mysql参数设置优化
数据结构优化:先读写分离、再垂直拆分、再水平拆分!
说3点
1. 设计合适的索引,基于主键的查找,上亿数据也是很快的;
2. 反范式化设计,以空间换时间,避免join,有些join操作可以在用代码实现,没必要用数据库来实现;
3. buffer,尽量让内存大于数据.
至于优化若是指创建好的表,不能变动表结构的话,那建议InnoDB引擎,多利用点内存,减轻磁盘IO负载,因为IO往往是数据库服务器的瓶颈
来自:http://www.zhihu.com/question/19719997
我的问题:两个数据库,database A 和 B(be) ;每个都有两个表event和id
A
id表增长到不会超过1亿,然后会有频繁的更新.更新需要查找id值。这个亦可以分表。按照gid的不同,在程序中处理插入不同哦功能的表
每天生成一个新表,然后整体再插入总表??
event表一直累加,会超过1亿,需要自动切表
问题:1 数据库是否是瓶颈? 再开几个进程看数据库插入更新会不会有加速现象.多开程序的作用已经不大,很微小。所以瓶颈在数据库上了
2 瓶颈在哪里? insert时间花费0--100毫秒 ,update 100--1000ms
具体做法:
原来查看速度:
Com_insert 100
Com_update 30
以下测试再关闭程序debug日志的情况下进行
使用gprof分析程序得到 parsesql占23.5%,parseupdatesql15.5%,jsontomap占23.5,推测数据库执行占40%?
1 程序是瓶颈,开了6个进程
原来速度:
2013.09.26 。10:00 开了6个进程来跑。速度
第一次测试 第二次测试
Com_insert 489 342
Com_update 204 182
措施:加内寸,拆表
得到结论: 1 只写入event表,看会不会堵塞。不需要做这个实验,DBA自动切表就行,这样就很小。
2 数据库表很大的时候,主要考虑IO速度慢的问题,因为表太大,不能全部放进内存,所以需要硬盘IO,引起速度慢。
1 查看表大小,event表占35G,gid表占3G。
数据库设定的内存大小是10G,event是在太大了,导致频繁的磁盘IO。
A gid
TABLE_NAME | DATA_LENGTH | DATA_LENGTH+INDEX_LENGTH | TABLE_ROWS |
+-------------+-------------+--------------------------+------------+
| Mapping_gid | 2980036608 | 3606970368 | 5162861 |
+-------------+-------------+--------------------------+-----------
event
+------------------------+-------------+--------------------------+------------+
| TABLE_NAME | DATA_LENGTH | DATA_LENGTH+INDEX_LENGTH | TABLE_ROWS |
+------------------------+-------------+--------------------------+------------+
| Mapping_event_20130925 | 29944184832 | 33361494016 | 61712037 |
+------------------------+-------------+--------------------------+------------+
B gid
+-------------+-------------+--------------------------+------------+
| TABLE_NAME | DATA_LENGTH | DATA_LENGTH+INDEX_LENGTH | TABLE_ROWS |
+-------------+-------------+--------------------------+------------+
| Mapping_gid | 2173698048 | 2702901248 | 4216890 |
+-------------+-------------+--------------------------+------------+
event
------------------------+-------------+--------------------------+------------+
| TABLE_NAME | DATA_LENGTH | DATA_LENGTH+INDEX_LENGTH | TABLE_ROWS |
+------------------------+-------------+--------------------------+------------+
| Mapping_event_20130925 | 6227492864 | 6919553024 | 15018002 |
对策:把event按每天备份 ; 这样每天的event表就很小。
结果:
第一次测试
Com_insert
Com_update 552
3 修改程序,原来程序insert不成功然后再update,改成insert into duplicate
可以解决的问题:1 多个进程写数据,id会跳跃性自增 2 两条变一条
各位,请教一个mysql问题。
说明:数据库id是主键,gid是唯一索引。insert into duplicate使用gid作为条件。
问题如下:
昨天我使用insert into duplicate 试验了很久、
我开了两个进程。都执行insert into duplicate语句。
进程A事实上只执行update,进程B 事实上只执行insert
单独开A时,id不变,单独开B,id是顺序增长同时开A,B,id跳跃性增长的。
可有什么解决方案推荐,使得id是顺序+1增长的?
解释: 只能说 insert
into duplicate 也使得id 自增了.但是如果后来执行的是update操作,撤销了.
可设置 innodb_autoinc_lock_mode = 0 使的获取自增id的锁方式为表锁,
但是此参数是全局的(即影响所有表,且需重启数据库生效),对于高并发写入的数据,会影响插入性能,不建议
如果使用insert into duplicate 只能解决两条变一条,不能解决id问题。
我具体做法:(1)开了多份程序,提高了数据库写入和更新的速度
(2) 加大内存
未填加内存前速度 -loginfo:
Com_insert Com_update
400 160
(3)修改字段
(4)拆表
mysql 千万量级的表的优化的更多相关文章
- Mysql千万级大表优化
Mysql的单张表的最大数据存储量尚没有定论,一般情况下mysql单表记录超过千万以后性能会变得很差.因此,总结一些相关的Mysql千万级大表的优化策略. 1.优化sql以及索引 1.1优化sql 1 ...
- 如何优化MySQL千万级大表
很好的一篇博客,转载 如何优化MySQL千万级大表 原文链接::https://blog.csdn.net/yangjianrong1985/article/details/102675334 千万级 ...
- MySQL千万级大表优化解决方案
MySQL千万级大表优化解决方案 非原创,纯属记录一下. 背景 无意间看到了这篇文章,作者写的很棒,于是乎,本人自私一把,把干货保存下来.:-) 问题概述 使用阿里云rds for MySQL数据库( ...
- (转载)MYSQL千万级数据量的优化方法积累
转载自:http://blog.sina.com.cn/s/blog_85ead02a0101csci.html MYSQL千万级数据量的优化方法积累 1.分库分表 很明显,一个主表(也就是很重要的表 ...
- 如何优化Mysql千万级快速分页,limit优化快速分页,MySQL处理千万级数据查询的优化方案
如何优化Mysql千万级快速分页,limit优化快速分页,MySQL处理千万级数据查询的优化方案
- Mysql千万级大表优化策略
1.优化sql以及索引 1.1优化sql 1.有索引但未被用到的情况(不建议) (1)避免like的参数以通配符开头时 尽量避免Like的参数以通配符开头,否则数据库引擎会放弃使用索引而进行全表扫描. ...
- MySQL千万级多表关联SQL语句调优
本文不涉及复杂的底层数据结构,通过explain解释SQL,并根据可能出现的情况,来做具体的优化. 需要优化的查询:使用explain 出现了Using temporary: ...
- MYSQL千万级数据量的优化方法积累
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...
- 一次MySQL两千万数据大表的优化过程,三种解决方案
问题概述 使用阿里云rds for MySQL数据库(就是MySQL5.6版本),有个用户上网记录表6个月的数据量近2000万,保留最近一年的数据量达到4000万,查询速度极慢,日常卡死.严重影响业务 ...
随机推荐
- Trie/Xor
题目链接 /*有一个数组a1,a2,a3--an.找到一个连续子段[l,r],使得al ^ al+1 ^--^ ar达到最大. 一般思路:维护前缀异或+暴力: for(int i=1;i<=n; ...
- lucene的两种分页操作
基于lucene的分页有两种: lucene3.5之前分页提供的方式为再查询方式(每次查询全部记录,然后取其中部分记录,这种方式用的最多),lucene官方的解释:由于我们的速度足够快.处理海量数据时 ...
- crontab使用和格式
什么是crontab crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令.具体的用法见下图: 关于crontab的格式: crontab的格式是分为6列:f1 f2 ...
- 【spring boot】SpringBoot初学(2) - properties配置和读取
前言 只是简单的properties配置学习,修改部分"约定"改为自定义"配置".真正使用和遇到问题是在细看. 一.主要 核心只是demo中的: @Proper ...
- Bootstrap Modal 垂直居中
Bootstrap 的 modal 正文中如果内容较少的话,并不会垂直居中,而是偏上, 如果想要达到垂直居中的效果,需要自动动手了. 可以在初始显示时设置垂直居中,可以这样做: $('#YourMod ...
- JSP内置对象--out对象(了解即可)
out对象是javax.servlet.jsp.JspWriter类的实例化对象,主要功能就是完成页面的输出操作,使用println()或print()输出.但是使用纪律很少,都会使用表达式完成输出的 ...
- public private proteccted区别
public公共,加上这个修饰的类或属性,可以在同一个包或者别的包里面访问 private私有的,加上这个修饰的类或属性,只能在同类里访问,同包和别的包不能访问 protected保护,加上这个修饰的 ...
- 使用JQuery结合HIghcharts实现从后台获取JSON实时刷新图表
项目做了一个报表,可以实时的观察呼叫中心的电话访问量,之前的版本是使用JFreechart做的,使用一段时间后出现内存溢出,服务器的内存使用量会变得很大,所以改用Ajax前台加载数据的方式实现实时报表 ...
- Android------三种监听OnTouchListener、OnLongClickListener同时实现即其中返回值true或者false的含义
引自:http://5200415.blog.51cto.com/3851969/1003113 android应用中常用的监听OnTouchListener.OnClickListener.OnLo ...
- IOS 9人机界面指南(1)
http://www.uisdc.com/ios9-interface-guideline-ui