原文:很不错的文章---【问底】徐汉彬:亿级Web系统搭建——单机到分布式集群
【导读】徐汉彬曾在阿里巴巴和腾讯从事4年多的技术研发工作,负责过日请求量过亿的Web系统升级与重构,目前在小满科技创业,从事SaaS服务技术建设。
【分布式】 【架构】 【服务器】 【mysql】 【性能】 【数据库】 …
本文是基于MySQL-5.7.7-rc版本,未来可能 还会发生更多变化。
1、支持多源复制(Multi-source replication),这对采用分库分表的同学绝对是个超级重磅福音。可以把多个MASTER的数据归并到一个实例上, 有助于提高SLAVE服务器的利用率。不过如果是同一个表的话,会存在主键和唯一索引冲突的风险,需要提前做好规划。
【新特性实践】
MySQL
5.7的多源复制采用多通道的模式,例如用以下方法可以创建多个复制通道,将多个MASTER上的数据复制到同一个SLAVE节点中去:
-- 需要先把 MASTER_INFO_REPOSITORY 和 RELAY_LOG_INFO_REPOSITORY 改成 TABLE 模式 [yejr@imysql.com]> SET GLOBAL MASTER_INFO_REPOSITORY = "TABLE"; Query OK, 0 rows affected (0.00 sec) [yejr@imysql.com]> SET GLOBAL RELAY_LOG_INFO_REPOSITORY = "TABLE"; Query OK, 0 rows affected (0.00 sec) -- …[获取更多]
大多数MySQL规范在网上也都能找得到相关的分享,在这里要分享的是老叶个人认为比较重要的,或者容易被忽视的,以及容易被混淆的一些地方。
1、默认使用InnoDB引擎
【老叶观点】已多次呼吁过了,InnoDB适用于几乎99%的MySQL应用场景,而且在MySQL
5.7的系统表都改成InnoDB了,还有什么理由再死守MyISAM呢。
此外,频繁读写的InnoDB表,一定要使用具有自增/顺序特征的整型作为显式主键。
【参考】:[MySQL FAQ]系列 — 为什么InnoDB表要建议用自增列做主键。
2、字符集选择utf-8
…
本文是基于MySQL-5.7.7-rc版本,未来可能 还会发生更多变化。
1、SQL MODE变化
a. 默认启用 STRICT_TRANS_TABLES 模式;
b. 对 ONLY_FULL_GROUP_BY 模式实现了更复杂的特性支持,并且也被默认启用;
c. 其他被默认启用的sql mode还有 NO_ENGINE_SUBSTITUTION;
【iMySQL建议】
对广大MySQL使用者而言,以往不是那么严格的模式还是很方便的,在5.7版本下可能会觉得略为不适,慢慢习惯吧。比如向一个20字符长度的VARCHAR列写入30个字符,在以前会自动截断并给个提示告警,而在5.7版本下,则直接抛出错误了。个人认为这倒是一个好的做法,避免各种奇葩的写法。
【新特性实践】
-- 查看默认的 sql_mode [yejr@imysql.com]> select @@sql_mode; +-----------------------------------------------------------------------------------+ | @@sql_mode | …[获取更多]
此前听说过某公司把xfs都替换成了ext4,感觉有些诧异,才有了本次测试。此次测试本意是想对比下xfs和ext4的差异,看看xfs是否还一如既往的靠谱。在测试的过程中,我还顺带测试了下MySQL 5.7.7和Percona-5.6.23的对比。
最终的建议写在前面:
1、可以继续放心大胆的采用xfs文件系统;
2、使用xfs文件系统时,无需刻意加一些优化参数,默认的(defaults,noatime,nodiratime,nobarrier)就够了;
3、可以继续优先选择Percona分支版本,除了thread
pool,它还有其他很多优秀的特性(MySQL官方暂无计划把thread pool功能移植到社区版);
4、 MySQL 5.7版本同样非常值得期待,但更希望加入Percona/MariaDB已经采用的、成熟的优秀补丁(thread
pool、slowlog、锁/mutex拆分等);
…
MySQL在以下几种情况会创建临时表:
1、UNION查询; 2、用到TEMPTABLE算法或者是UNION查询中的视图; 3、ORDER BY和GROUP BY的子句不一样时; 4、表连接中,ORDER BY的列不是驱动表中的; 5、DISTINCT查询并且加上ORDER BY时; 6、SQL中用到SQL_SMALL_RESULT选项时; 7、FROM中的子查询; 8、子查询或者semi-join时创建的表;
EXPLAIN 查看执行计划结果的 Extra 列中,如果包含 Using Temporary 就表示会用到临时表。
当然了,如果临时表中需要存储的数据量超过了上限( tmp-table-size 或 …
[获取更多]本文是基于MySQL-5.7.7-rc版本,未来可能 还会发生更多变化。本节开始讲5.7版本中的新特性。
1、安全性
a. 用户表 mysql.user 的 plugin字段不允许为空, 默认值是 mysql_native_password,而不是
mysql_old_password,不再支持旧密码格式;
b. 增加密码过期机制,过期后需要修改密码,否则可能会被禁用,或者进入沙箱模式;
c. 使用 mysql_install_db 初始化时,默认会自动生成随机密码,并且不创建除 root@localhost
外的其他账号,也不创建 test 库;
【新特性实践】
执行 mysql_install_db 进行新实例初始化:
[yejr@imysql.com]# ./bin/mysql_install_db --user=mysql --datadir=/data/mysql/ 2015-06-24 13:55:29 [WARNING] mysql_install_db is deprecated. Please consider switching to mysqld --initialize 2015-06-24 13:55:38 [ERROR] Child process: …[获取更多]