编辑: 向日葵8AS | 2014-06-08 |
【商标声明】 及其它腾讯云服务相关的商标均为腾讯云计算(北京)有限责任公司及其关联公司所有.本文档涉及的第三方主体 的商标,依法由权利人所有. 【服务声明】 本文档意在向客户介绍腾讯云全部或部分产品、服务的当时的整体概况,部分产品、服务的内容可能有所调整.您 所购买的腾讯云产品、服务的种类、服务标准等应由您与腾讯云之间的商业合同约定,除非双方另有约定,否则, 腾讯云对本文档内容不做任何明示或模式的承诺或保证. 云数据库 MySQL 版权所有:腾讯云计算(北京)有限责任公司 第3 共65页 文档目录 最佳实践 云数据库 MySQL 使用规范 为云数据库 MySQL 创建 VPC 使用云数据库 MySQL 提高业务负载能力 部署 Python Web 应用程序 构建 LAMP 堆栈 Web 应用程序 构建 Drupal 网站 MySQL 主实例参数修改的影响 通过 Python 语言使用 MySQL API 实例购买 实例管理 备份任务 云数据库 MySQL 版权所有:腾讯云计算(北京)有限责任公司 第4 共65页 目的 规范化对云数据库 MySQL 的管理和维护,避免操作不当对云数据库 MySQL 造成不可用等影响. 指导数据库开发人员合理编写 SQL,发挥云数据库 MySQL 最优性能. 受众 云数据库 MySQL 产品用户. 权限管理规范 考虑到云数据库 MySQL 的稳定性和安全性,云数据库 MySQL 限制了 super、shutdown、file 权限,有时在云 数据库 MySQL 上执行 set 语句时,会出现如下的报错: #1227-Access denied;
you need(at least one of)the SUPER privilege (s) for this operation 解决方法:如果需要 set 修改相关参数,可以使用控制台实例管理页的【数据库管理】>
【参数设置】功能完成, 如果需要修改的参数不在其中,可以 提交工单 后经评估后协助修改,确保实例稳定. 按需授权,一般应用程序只授权 DML(SELECT、UPDATE、INSERT、DELETE)权限即可. 授权对象最小化原则,一般的应用程序访问用户按库级别来授权. 授权用户访问时只允许特定 IP 或IP 段访问,可以在控制台配置安全组来做限制,安全组的设置请一定按照控制 台提示的标准来操作,如果是公网访问设置安全组的场景,请一定放通所有涉及到的出口 IP. 管理帐号与开发帐号分离. 日常操作规范 尽量避免业务高峰期做 online ddl 操作,可以使用的工具请参考: pt-online-sche-machange . 尽量避免业务高峰期批量操作数据,最好在业务低峰期分批来操作. 尽量避免一个实例跑多个业务,耦合度太高会存在业务之间互相影响的风险. 禁止使用弱密码,提升数据库实例安全性. 最佳实践 云数据库 MySQL 使用规范 最近更新时间:2019-06-12 16:26:47 云数据库 MySQL 版权所有:腾讯云计算(北京)有限责任公司 第5 共65页 建议关闭事务自动提交,线上操作养成 begin;
先行的习惯,降低误操作导致数据丢失的风险,误操作亦可使用 TencentDB 的回档功能(目前支持5天内任意时间点回档),若相关表不涉及跨库跨表的逻辑,可使用快速回档 或者极速回档来更快恢复数据,回档新生成的库表名默认是原库表名 _bak . 业务有推广活动等,请提前预估资源并做好实例相关优化,如需求量比较大时请及时与对应的服务经理联系. 内网连接登录须确保 client 端的 CVM 机器与 TencentDB 是同一账号同一地域的机器. 控制台下载的 binlog 日志,需要在本地解析的话,须确保客户端的 MySQL 版本与云数据库 MySQL 实例的版本 一致,否则会出现解析出乱码的情况,建议使用3.4或以上版本的 mysqlbinlog. 控制台上通过内网在 CVM 上下载冷备文件时,请用引号将 url 包起来,否则会出现404报错. 库表设计规范 通过业务场景分析和数据访问(包括数据库读写 QPS、 TPS、存储空间等)的预估,合理规划数据库使用资源, 也可以在控制台云监控界面,配置云数据库 MySQL 实例的各项监控. 建库原则就是同一类业务的表放一个库,不同业务的表尽量避免公用同一个库,尽量避免在程序中执行跨库的关 联操作,此操作对后续的快速回档也会产生一定的影响. 每张表必须要有主键,即使选不出合适的列做主键,亦必须添加一个无意义的列做主键 MySQL 第一范式标准 InnoDB 辅助索引叶子节点会保存一份主键值,推荐用自增短列作为主键,降低索引所占磁盘空间提升效 率, binlog_format 为row 的场景下,批量删数据没主键会导致严重的主从延迟. 认准 InnoDB 引擎线上 TencentDB 产品,5.6版本开始即不支持 MyISAM 引擎(官方 MySQL 8.0 开始也不支 持),有memory 引擎需求的,建议使用 redis 或者 memcached 自建数据库迁移到 TencentDB 会MyISAM 自动转 InnoDB,故需满足以下两点否则会任务失败. 存在自增列的表,自增列上必须存在一个单独的索引,若在复合索引中,自增列必须置于第一位. row_format 必须保证为非 fixed. 字符集统一使用 utf8mb4 降低乱码风险,部分复杂汉字和 emoji 表情必须使用 utf8mb4 方可正常显示,修改字 符集只对修改后创建的表生效,故建议新购 TencentDB 初始化实例时即选择 utf8mb4. 小数字段推荐使用 decimal 类型,float 和double 精度不够,特别是涉及金钱的业务,必须使用 decimal. 尽量避免据库中使用 text/blob 来存储大段文本、二进制数据、图片、文件等内容,而是将这些数据保存成本地 磁盘文件,数据库中只保存其索引信息. 尽量不使用外键,建议在应用层实现外键的逻辑,外键与级联更新不适合高并发场景,降低插入性能,大并发下 容易产生死锁. 字段尽量定义为 NOT NULL 并加上默认值,NULL 会给 SQL 开发带来很多问题导致走不了索引,对NULL 计算 时只能用 IS NULL 和IS NOT NULL 来判断. 降低业务逻辑和数据存储的耦合度,数据库存储数据为主,业务逻辑尽量通过应用层实现,尽可能减少对存储过 程、触发器、函数、event、视图等高级功能的使用,这些功能移植性、可扩展性较差,若实例中存在此类对象, 建议默认不要设置 definer,避免因迁移账号和 definer 不一致导致的迁移失败. 短期内业务达不到一个比较大的量级,建议禁止使用分区表.分区表主要用作归档管理,多用于快递行业和电商 行业订单表,分区表没有提升性能的作用, 除非业务中 80% 以上的查询走分区字段. 云数据库 MySQL 版权所有:腾讯云计算(北京)有限责任公司 第6 共65页 对读压力较大,且一致性要求较低(接受数据秒级延时)的业务场景,建议购买只读实例从库来实现读写分离策 略. 索引设计规范 单表的索引数建议不超过5个,单个索引中的字段数建议不超过5个,太多起不到过滤作用,索引也占空间,管理 起来也耗资源. 选择业务中 SQL 过滤走的最多的并且 cardinality 值比较高的列建索引,业务 SQL 不走的列建索引是无意义的, 字段的唯一性越高即代表 cardinality 值越高,索引过滤效果也越好,一般索引列的 cardinality 记录数小于10% 我们可认为这是一个低效索引,例如性别字段. varchar 字段上建索引时,建议指定索引长度,不要直接将整个列建索引, 一般 varchar 列比较长,指定一定长 度作索引已经区分度够高,没必要整列建索引,整列建索引会显得比较重,增大了索引维护的代价,可以用 count(distinct left(列名, 索引长度))/count(*) 来看索引区分度. 避免冗余索引,两个索引 (a,b) (a) 同时存在,则(a) 属于冗余索引――redundant index,若查询过滤条件为 a 列,(a,b) 索引就够了,不用单独建 (a) 索引. 建复合索引的时候,区分度最高的列放索引的在最左边, 例如 select xxx where a = x and b = x;