`
- 浏览:
458970 次
- 性别:
- 来自:
北京
-
背景
主要介绍,日常线上mysql操作,需要注意的情况。包括字段类型,索引,数据表,上线alter table等规范和注意事项。
等级划分:建议,不推荐,禁止
所有规则总有例外,要灵活,辩证看待问题
创建sql规范
DATABASE
1,是否需要使用数据库?
不是所有的东西都需要存在DB中,临时数据,日志数据等不需要,合理使用HBase,memcached,Redis等 不仅仅只有RMDB
2,数据库划分?
目前一般是根据业务逻辑划分数据库。
如果是新业务需求,要合理考虑DB存放mysqld。 目前线上主要3台mysqld,按照业务重要程度来划分:
主库相关:DB33
S级业务数据:DB22 pay, ivr, verify等库
不很重要的数据:DB19 mail,sms,newsletter等库
TABLE
1,存储引擎: InnoDB
没有任何理由不使用InnoDB, 也不建议使用MyISAM,性能上并没有好多少。
其他的存储引擎,更不推荐。
禁止主从库的数据表使用不同的存储引擎
2,CHARSET: utf8
线上大家统一标准,没有特殊理由,禁止使用其他编码标准
3,遵循大段数据和小段数据分开:
如果某个表,有一个大内容字段,和一堆小字段。尤其是小字段的读取频繁、更新频繁跟大内容字段不一致时,建议放置这个大内容字段和小字段段。当然这样也增加了一些复杂度,要全面考虑。
例子: 线上的一张deal表,有频繁更新的curnumber字段,也有非常巨大的字段detail(blob),导致deal的各种查询都有可能慢查询。
主要原因:1,频繁写block读;2,字段太大,不利于缓存,读写性能都差。
4,遵循冷热数据分开:
建表时,遵循更新频率不同的数据分开。频繁更新的字段应该和不怎么频繁更新的字段分开。这样有利于在流量大时,进行分开控制。更新不频繁的字段可以最限度地使用缓存。
5,预估表数据量:
线上一个表究竟可以存放多少行?取决于该表每一行的大小。通常来说,不要超过千万(如果是类似的日志表,扫表需求小,不要超过亿行)。如果业务逻辑估计会突破亿,就要考虑分表。
当然分表带来的缺点:可能会存放一些容易的索引表信息,有些group 等需求无法实现。要全面考虑。
目前线上库是支持一些分表场景,具体参考相关文档。
例子: creditlog用到了非主键+取模分表; smstask用到了主键+区间分表; mailtask用到了时间分表,它们都是针对特定业务逻辑选择的分表方法
Schema Data Type
1,够用原则
tiny int , small int, medium int, int, big int 表示范围不同,请根据业务需求使用,必要浪费字段
注意:不要太极端,线上推荐3种, tiny, int, big int。 一般status等都是tiny int,,,可能超过42亿的ID(或者手机号码),用big int, 其他id都是 int。
例子: 历史上,有多次使用smallint,结果超过范围,导致出错的情况。
2,简单原则
int 比 string 更块的比较。 手机号码,IP地址等存储。当然,如果IP存储只是为了人看的统计,记录string更直观一些
3,禁止NULL数据
避免NULL,默认值也不要是NULL。 增加排序复杂
4,char Vs varchar
长度明确 && 短小,建议用char, 其他情况用varchar
5,varchar(xxx) 不建议太慷慨
临时表计算(order, group)会有麻烦
例子:mailtask utm_参数过大,导致自己group by 统计,超过/tmp下空间,导致失败。
6,如果可能,不要用实数。如果要用,请使用DECIAML, 而不是FLOAT, DOUBLE (精确度问题)
decimal 的计算,是mysql实现,而不是CPU直接实现。效率较低,并且存储空间多。线上价格 存储都用decimal(11,2) ,其实也可以直接存int, 数值是分。
Index
1,禁止重复索引
PRIMARY KEY , UNIQUE 不要同时出现
2,禁止滥用索引
索引仅仅是为了线上查询提供服务,不要为没有的线上访问需求滥用索引。
3,不推荐对数据区分小的字段,建立索引
比如性别字段,经验值,重合度低于20%(视表的横向大小浮动)。
主要是因为 硬盘的顺序读 > 随机读 mysql 预读机制
4,不推荐索引varchar:
如果真要索引,可以使用前缀索引(字符串很长),例如 deal表的predealid KEY `predealid` (`predealid`(8)),
或者自建hash值,索引(字符串长度比较固定)。需要注意hash值,用crc,而不是md5 散列问题.
5,尽可能多级索引,而不是多余索引
多余索引 index1 (xid, addtime), (xid, type)
多级索引 index1 (xid, type, addtime)
反例:为了防止旧索引过大,可以考虑多余索引
线上执行sql规范
总体流程:
1,充分论证
比如加字段、加索引
A、得确定一定需要加这个索引。加这个字段。
没有别的手段,或者别的手段实现很不好。比如带来很多程序上的改动、导致整个系统结构复杂。
B、当前表数据量允许加这个字段加这个索引
C、是否其他组的同学会受到影响?
2,小心谨慎 不能随意操作
原则如下:
A、上百M的数据量得停止该相关的服务。
B、数据量不到百M,记录数在百万条以内,可以在低峰期进行(比如凌晨)。
C、数据量在万条以内、数据量在10M以内,可以在白天的非高峰点操作(可以分成多步操作)。
3,多步合一
在操作时,为了尽可能减少影响和操作时间,对同一个表进行的多步操作进行合并。比如对同一个表既加字段、又加索引,那么就应该写成一条语句。减少复制临时表的时间。
4,事前准备
A、事前确认操作的数据、操作命令及其所带来的影响。可以事先联系sa,搭建虚拟环境,测试.
B、写下整个操作的流程,中间用到的命令、事后检查所需要的命令。
5,事后检验
A、操作完成之后,检查所有同步是否正常。
B、操作完成之后,用命令检查所有的数据库是否均已生效。(不仅仅是主库,还包括所有辅库,检查脚本提前准备好)。
C、对于多步大的操作,应该至少有两人参加(sa和rd在一起),每一步操作后都要确认。比如,操作是否达到到预期的效果。(这些操作检查,都应该配备脚本,在检查时执行)。
6,发邮件通知
通知给相关同学,包括mis,data组
一些规范
1,所有的SQL都要存放在git sql目录下。
2,建立ticket给sa,必须明确一下内容:
服务器名字
sql文件的位置
是否需要重新启动apache服务器
该脚本预期执行时间,会影响的数据行数,是否对线上服务有影响
一些特殊要求,比如关闭主从报警等
3,禁止单表多个更改字段,用多次alter table命令
4,线上删除数据,需要严格控制速度,不要超过100/s;
原因分析:
见 innodb_max_purge_lag研究分享http://hot66hot.iteye.com/blog/1771034
5,明确alter table的危害性
alter table就是拷贝了一份全量数据入新表,即使你认为应该不需要拷贝的情况,他都会拷贝,比如
rename 一个column name (mv .frm)
修改column default value (alter table alter/change/modify column)
都会全量拷贝数据一次。
解决方案&分析见:http://www.taobaodba.com/html/534_mysql_online_ddl_and_nosql_schemaless_design.html
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
2. 规范化数据导入导出:批量数据操作时,使用LOAD DATA INFILE代替INSERT语句,可显著提升速度。 3. 定期分析和优化表:ANALYZE TABLE和OPTIMIZE TABLE命令可更新统计信息和重构数据文件,保持数据库高效运行。 ...
### MySQL数据库编程规范详解 #### 第一部分 概述 ##### 1.1 背景 随着企业数据量的增长和业务复杂度的提高,统一的数据管理标准变得尤为重要。本规范旨在标准化MySQL数据库的设计、实现与维护流程,确保数据的...
- 如何在不同的操作系统上安装 Perl 及其与 MySQL 的集成。 - **4.11 系统特定的问题** - 对于各种操作系统(如 Solaris、Linux 等)提供了详细的安装指导。 - **4.12 Win32 注意事项** - 在 Windows 系统下的...
MySQL是一种关系型数据库管理系统,本知识库分享涵盖了MySQL的多个方面,包括查询数据、约束、数据排序与分组、外键、索引、子查询、多表查询、常用函数、数据库设计规范、排名实现等。 一、 MySQL查询数据 MySQL...
MySQL Connector/J 8.0.30 是 MySQL 官方提供的用于 Java 应用程序的数据库驱动程序,它实现了 JDBC(Java Database Connectivity)规范,使得 Java 开发人员能够方便地在 MySQL 数据库上进行数据操作。这篇内容将...
Python操作MySQL数据库是常见的数据处理任务,特别是在web开发中,MySQL作为后端数据库,而Python作为脚本语言处理数据。Python提供了Python DB-API(数据库应用编程接口),这是一套规范,定义了Python程序与数据库...
MySQL高效编程是数据库管理员、开发人员以及对...总之,"MYSQL高效编程.pdf"这本书应该是一本全面介绍MySQL高效使用和管理的指南,涵盖了从基础到高级的各个层面,旨在帮助读者提升MySQL操作的效率和数据库的整体性能。
毕业设计,基于Python+Django+Vue+MySql开发的前后端分离的校园...系统具有界面清晰、操作简单,功能齐全的特点,使得校园资料分享平台管理工作系统化、规范化。 关键词:校园资料分享平台;Django框架;MySQL数据库
MySQL是世界上最受欢迎的关系型...在实际使用MySQL时,应根据具体需求选择合适的存储引擎,并注意数据安全、性能优化和规范化设计。通过学习和实践这些基本概念和操作,可以更好地理解和运用MySQL来管理和操作数据库。
MySQL面试题分享 以下是根据提供的文件信息生成的相关知识点: 1. 登陆MySQL数据库 登录MySQL数据库可以使用以下命令:`mysql -u username -p` 2. 开启/关闭MySQL服务 可以使用以下命令来开启或关闭MySQL服务:...
《Mysql中文参考手册》详尽地介绍了MySQL数据库管理系统中所使用的语言及其应用规范。本章节着重于文字处理,即字符串和数字的书写规则,对于理解并正确操作MySQL数据库至关重要。 #### 二、字符串的书写规则 字符...
《MySQL开发者SQL权威指南》是一本专为MySQL开发者设计的全面教程,旨在帮助读者深入理解和熟练运用SQL语言,提升在MySQL数据库管理与开发中的技能。本指南覆盖了从基础概念到高级特性的广泛内容,是MySQL数据库管理...
1. **数据库管理**:Toad for MySQL支持多种数据库操作,包括连接到MySQL服务器、创建和管理数据库、表、索引、视图等。它还允许用户进行权限管理,确保数据库的安全性。 2. **SQL开发**:内置的SQL编辑器提供了...
本讲座由叶金荣分享,主要涵盖了多个关键方面,包括规范、基础规范、命名规范、库表规范、字段规范、索引规范以及开发环境的优化。 1. **基础规范**: - 引擎选择:推荐全面使用InnoDB引擎,因其支持事务处理和...
手册中列出了MySQL实现中与标准SQL规范的差异之处。 1.8.3 MySQL如何处理约束 约束是保证数据库数据完整性的机制,MySQL支持多种约束类型,并在数据操作中强制执行这些约束。 1.9 致谢 1.9.1 MySQL贡献者 手册中对...
DBExportDoc V1.0 For MySQL 是一个专为MySQL数据库设计的实用工具,它能够将数据库的结构以Word文档的形式导出,便于用户进行查阅、分享和文档化管理。这个工具对于数据库管理员、开发人员以及项目团队来说尤其有用...
它由一系列复杂的SQL查询组成,涵盖了各种常见的数据分析操作,如聚合、排序、分组等。tpch-mysql-master工具就是将TPC-H测试套件与MySQL数据库相结合,帮助用户评估MySQL在处理复杂查询和大数据量时的性能表现。 ...
以上知识点对于任何使用MySQL数据库的开发者或者数据库管理员来说都是基础且必要的,从基本的数据库结构设计,到操作规范,再到性能调优,都提供了详细的指导和建议。通过这些内容的学习,可以帮助技术人员更好地...
MySQL采用了严格的编码规范,这对于保持代码的一致性和可读性非常重要。这些规范涵盖了命名约定、注释风格等方面。此外,还有一系列的最佳实践建议,帮助开发者避免常见的错误并提高代码质量。 #### 五、处理查询...
《Navicat 12 for MySQL:可视化数据库管理利器》 ...免费分享的Navicat 12 for MySQL版本,无疑为用户节省了时间和成本,让数据库管理工作变得更加高效。如果你是MySQL的使用者,这款工具值得你拥有和探索。