MySQL 对于千万级的大表要怎么优化?

转载 2018年04月16日 19:55:13

19条规则摘要如下:

规则1:一般情况可以选择MyISAM存储引擎,如果需要事务支持必须使用InnoDB存储引擎。

规则2:命名规则。

规则3:数据库字段类型定义

  1. 经常需要计算和排序等消耗CPU的字段,应该尽量选择更为迅速的字段,如用TIMESTAMP(4个字节,最小值1970-01-01 00:00:00)代替Datetime(8个字节,最小值1001-01-01 00:00:00),通过整型替代浮点型和字符型
  2. 变长字段使用varchar,不要使用char
  3. 对于二进制多媒体数据,流水队列数据(如日志),超大文本数据不要放在数据库字段中

规则4:业务逻辑执行过程必须读到的表中必须要有初始的值。避免业务读出为负或无穷大的值导致程序失败

规则5:并不需要一定遵守范式理论,适度的冗余,让Query尽量减少Join

规则6:访问频率较低的大字段拆分出数据表。有些大字段占用空间多,访问频率较其他字段明显要少很多,这种情况进行拆分,频繁的查询中就不需要读取大字段,造成IO资源的浪费。

规则7:大表可以考虑水平拆分。大表影响查询效率,根据业务特性有很多拆分方式,像根据时间递增的数据,可以根据时间来分。以id划分的数据,可根据id%数据库个数的方式来拆分。

一.数据库索引

规则8:业务需要的相关索引是根据实际的设计所构造sql语句的where条件来确定的,业务不需要的不要建索引,不允许在联合索引(或主键)中存在多于的字段。特别是该字段根本不会在条件语句中出现。

规则9:唯一确定一条记录的一个字段或多个字段要建立主键或者唯一索引,不能唯一确定一条记录,为了提高查询效率建普通索引

规则10:业务使用的表,有些记录数很少,甚至只有一条记录,为了约束的需要,也要建立索引或者设置主键。

规则11:对于取值不能重复,经常作为查询条件的字段,应该建唯一索引(主键默认唯一索引),并且将查询条件中该字段的条件置于第一个位置。没有必要再建立与该字段有关的联合索引。

规则12:对于经常查询的字段,其值不唯一,也应该考虑建立普通索引,查询语句中该字段条件置于第一个位置,对联合索引处理的方法同样。

规则13:业务通过不唯一索引访问数据时,需要考虑通过该索引值返回的记录稠密度,原则上可能的稠密度最大不能高于0.2,如果稠密度太大,则不合适建立索引了。

规则14:需要联合索引(或联合主键)的数据库要注意索引的顺序。SQL语句中的匹配条件也要跟索引的顺序保持一致。

注意:索引的顺势不正确也可能导致严重的后果。

规则15:表中的多个字段查询作为查询条件,不含有其他索引,并且字段联合值不重复,可以在这多个字段上建唯一的联合索引,假设索引字段为 (a1,a2,...an),则查询条件(a1 op val1,a2 op val2,...am op valm)m<=n,可以用到索引,查询条件中字段的位置与索引中的字段位置是一致的。

规则16:联合索引的建立原则(以下均假设在数据库表的字段a,b,c上建立联合索引(a,b,c))

规则17:重要业务访问数据表时。但不能通过索引访问数据时,应该确保顺序访问的记录数目是有限的,原则上不得多于10.

二.Query语句与应用系统优化

规则18:合理构造Query语句

规则19:应用系统的优化

1.优化你的sql和索引;

2.加缓存,memcached,redis;

3.做主从复制或主主复制,读写分离,可以在应用层做,效率高,也可以用三方工具,第三方工具推荐360的atlas,其它的要么效率不高,要么没人维护;

4.mysql自带分区表,先试试这个,对你的应用是透明的,无需更改代码,但是sql语句是需要针对分区表做优化的,sql条件中要带上分区条件的列,从而使查询定位到少量的分区上,否则就会扫描全部分区,另外分区表还有一些坑,在这里就不多说了;

5.做垂直拆分,其实就是根据你模块的耦合度,将一个大的系统分为多个小的系统,也就是分布式系统;

6.水平切分,针对数据量大的表,这一步最麻烦,最能考验技术水平,要选择一个合理的sharding key,为了有好的查询效率,表结构也要改动,做一定的冗余,应用也要改,sql中尽量带sharding key,将数据定位到限定的表上去查,而不是扫描全部的表;

7、选取最适用的字段属性

8、使用连接(JOIN)来代替子查询(Sub-Queries)

9、使用联合(UNION)来代替手动创建的临时表

10、事务

11、锁定表

如何设计或优化千万级别的大表?此外无其他信息,个人觉得这个话题有点范,就只好简单说下该如何做,对于一个存储设计,必须考虑业务特点,收集的信息如下:
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

以及调整一些参数值:sort_buffer_size,read_buffer_size,read_rnd_buffer_size,join_buffer_size 

MySQL 对于千万级的大表要怎么优化? - MySQL - 知乎

很多人第一反应是各种切分;我给的顺序是: 第一优化你的sql和索引; 第二加缓存,memcached,redis; 第三以上都做了后,还是慢,就做主从复制或主主复制,读写分离,可以在应用...
  • bigtree_3721
  • bigtree_3721
  • 2016-05-31 01:19:57
  • 3112

MySQL 对于千万级的大表要怎么优化

知乎讨论:https://www.zhihu.com/question/19719997 48 个回答 默认排序 ...
  • andychiu
  • andychiu
  • 2017-06-06 13:37:11
  • 855

MySQL 对于千万级的大表要怎么优化?

MySQL 对于千万级的大表要怎么优化?
  • ROVAST
  • ROVAST
  • 2017-07-12 14:15:59
  • 188

MySQL 对于千万级的大表要怎么优化?

对大数据的数据库管理优化的总结: 常用的优化sql----突出快字,使完成操作的时间最短 1、用索引提高效率: 2、选择有效率的表名顺序,及数据结构及字段; 3、使用D...
  • tuchaofu
  • tuchaofu
  • 2016-05-29 22:53:32
  • 784

千万级的大表!MySQL这样优化更好

对于一个千万级的大表,现在可能更多的是亿级数据量,很多人第一反应是各种切分,可结果总是事半功倍,或许正是我们优化顺序的不正确。下面我们来谈谈怎样的优化顺序可以让效果更好。 MySQL数据库一般都是按...
  • bjash
  • bjash
  • 2017-02-21 10:14:23
  • 410

MYSQL一次千万级连表查询优化(一)

概述:交代一下背景,这算是一次项目经验吧,属于公司一个已上线平台的功能,这算是离职人员挖下的坑,随着数据越来越多,原本的SQL查询变得越来越慢,用户体验特别差,因此SQL优化任务交到了我手上。 ...
  • Tim_phper
  • Tim_phper
  • 2017-10-25 18:02:11
  • 4088

mysql优化记录

 原文:7 keys to better MySQL performance 作者:Peter Zaitsev 译者:Peter 译者注: 随着尺寸和负载的增长,MySQL的性能会趋...
  • weixin_39904033
  • weixin_39904033
  • 2018-01-12 20:26:37
  • 95

mysql数据库优化大全

数据库优化 sql语句优化 索引优化 加缓存 读写分离 分区 分布式数据库(垂直切分) 水平切分 MyISAM和InnoDB的区别: 1. InnoDB支持事务,MyISAM不支持...
  • weixin_38112233
  • weixin_38112233
  • 2018-01-14 00:16:34
  • 133

oracle大数据表(千万级)修改,删除优化技巧【转】

oracle大数据表(千万级)修改,删除优化技巧 运行下面的SQL delete  from idwsq11.SH30_PRCSS_EXCTN_LOG e where deriv_prcss_t...
  • dada678
  • dada678
  • 2016-06-30 06:48:10
  • 1036

Mysql千万级别数据优化方案

Mysql千万级别数据优化方案 目录 目录... 1 一、         目的与意义... 2 1)     说明... 2 二、         解决思路与根据(本测试表中数据在...
  • yangshufengyrtyfyu
  • yangshufengyrtyfyu
  • 2014-04-11 13:30:02
  • 2216
收藏助手
不良信息举报
您举报文章:MySQL 对于千万级的大表要怎么优化?
举报原因:
原因补充:

(最多只允许输入30个字)