mysql 大表查询优化对于千万级的大表要怎么优化

> 博客详情
摘要: MySQL 对于大表(千万级),要怎么优化
提到优化,先要确定出现的问题,是存储引擎选择问题,还是sql语句使用问题(如:索引)亦或者是单一存储服务器对于千万级别的数据力不从心。解决方法:1、根据不同业务选用不同存储引擎,虽然一般情况下都优先选择InnoDB。
mysql两种存储引擎的区别:
& & &MyISAM & & & & & & & &Innodb&
事物支持 : & 不支持 & & & & & & & & & & 支持&
锁的粒度: & &table & & & & & & & & & & &Row&
存储容量: & &没有上限 & & & & & & & & & 64TB&
哈希索引 : & 不支持 & & & & & & & & & & 支持&
全文索引: & &支持 & & & & & & & & & & & 不支持&
外键: & & & &不支持 & & & & & & & & & & 支持&
2、分析sql语句的影响结果集。查慢查询日志,定位慢查询的sql语句,查看是否有锁定的sql操作。3、分库,分表,分区(慎用分区,往往OLTP操作不适用分区,分区反倒会拖慢原有查询)4、利用缓存或NoSql代替现有一些热点查询操作,减轻Mysql压力。分库:可以基于业务逻辑拆分,不同业务分布在不同服务器中,减少单一服务器压力分表:垂直分表和水平分表两种方式垂直分表:将表中的一些频繁更新和非频繁更新的字段分开存放水平分表,三种分表方式:均等分表,哈希方式分表,优点是负载平均分布,缺点是当容量持续增加时扩荣不方便,需要重新分表,主键就很不好处理。递增分表,比如每一千万数据开一个新表,优点是自适应强,缺点是数据负载不均衡,需要代码层额外处理。
时间分表,根据不同的创建时间分表,适用于OLAP应用。
参照&http://my.oschina.net/ifeixiang/blog/339581
人打赏支持
码字总数 43412
支付宝支付
微信扫码支付
打赏金额: ¥
已支付成功
打赏金额: ¥
& 开源中国(OSChina.NET) |
开源中国社区(OSChina.net)是工信部
指定的官方社区TA的最新馆藏查看: 4231|回复: 10
如何设计或优化千万级别的大表提问的统一解答
论坛徽章:52
知呼或ITPUB论坛上的提问:如何设计或优化千万级别的大表?此外无其他信息,个人觉得这个话题有点范,就只好简单说下该如何做,对于一个存储设计,必须考虑业务特点,收集的信息如下:
1.数据的容量:1-3年内会大概多少条数据,每条数据大概多少字节;
2.数据项:是否有大字段,那些字段的值是否经常被更新;
3.数据查询SQL条件:哪些数据项的列名称经常出现在WHERE、GROUP BY、ORDER BY子句中等;
4.数据更新类SQL条件:有多少列经常出现UPDATE或DELETE 的WHERE子句中;
5.SQL量的统计比,如:SELECT:UPDATE+DELETE:INSERT=多少?
6.预计大表及相关联的SQL,每天总的执行量在何数量级?
7.表中的数据:更新为主的业务 还是 查询为主的业务
8.打算采用什么数据库物理服务器,以及数据库服务器架构?
9.并发如何?
10.存储引擎选择InnoDB还是MyISAM?
大致明白以上10个问题,至于如何设计此类的大表,应该什么都清楚了!
至于优化若是指创建好的表,不能变动表结构的话,那建议InnoDB引擎,多利用点内存,减轻磁盘IO负载,因为IO往往是数据库服务器的瓶颈
另外对优化索引结构去解决性能问题的话,建议优先考虑修改类SQL语句,使他们更快些,不得已只靠索引组织结构的方式,当然此话前提是,
索引已经创建的非常好,若是读为主,可以考虑打开query_cache,
以及调整一些参数值:sort_buffer_size,read_buffer_size,read_rnd_buffer_size,join_buffer_size
论坛徽章:10
呵呵 上面的几个问题都是DBA们最在乎的问题~
论坛徽章:4
大表的话 应该分表的 也减少些压力
论坛徽章:4
原帖由 leadhoo 于
02:46 发表
大表的话 应该分表的 也减少些压力
同意,我们现在上了千万级数量级别的表都是md5分成16张字表。
论坛徽章:11
当然要水平切分表了,根据我的实际经验,单表不要超过500W记录,这个不是MySQL能不能承担千万级的大表(肯定能,之前我就有个业务表
达到了4000W+的数据,被我水平切分成了16个表分散到分库中)
而是有没有必要,肯定要切分的
否则你为了提高查询性能要付出其他成本
论坛徽章:8
水平切分16个表,什么意思,就是原来表假如有16个字段,就是建16个表,每个表一个段?
如果不是这样,那是怎么水平切分?
论坛徽章:4
原帖由 magscott 于
20:21 发表
水平切分16个表,什么意思,就是原来表假如
有16个字段,就是建16个表,每个表一个段?
如果不是这样,那是怎么水平切分?
比如表 msg_log,主键字段id int类型。
是md5(id)得出的字符串,取第一个字母,总共有16个首字母(0,1,2,3....a,b,c...f),扯分成msg_log_0、msg_log_1......msg_log_c...,msg_log_f等16张表,然后数据就按照pkid的md5(id)的首字母决定,数据存放入哪一张表里面去。
认证徽章论坛徽章:27
回复 #1 jinguanding 的帖子
楼主实际生产环境中用过msyql的分区特性么?
论坛徽章:52
回复 #8 mchdba 的帖子
有用的.........用于SNS的场景,以及一个内部监控系统
MySQL版本分别为:5.1.34,5.1.40
认证徽章论坛徽章:27
回复 #9 jinguanding 的帖子
用了多长时间了,发现隐患了没有?出过啥莫名其妙的bug没有?
itpub.net All Right Reserved. 北京皓辰网域网络信息技术有限公司版权所有    
 北京市公安局海淀分局网监中心备案编号: 广播电视节目制作经营许可证:编号(京)字第1149号

我要回帖

更多关于 win7注册表优化大全 的文章

 

随机推荐