千金良方——MySQL性能优化金字塔法则(txt+pdf+epub+mobi电子书下载)


发布时间:2020-07-07 14:10:17

点击下载

作者:李春

出版社:电子工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

千金良方——MySQL性能优化金字塔法则

千金良方——MySQL性能优化金字塔法则试读:

前言

性能问题

这个世界是由问题组成的,理想的状态和实际状态之间的差异造成了问题。国家领导解决人民生活幸福的大问题,公司的总经理解决盈利的问题,而本书只想解决MySQL数据库性能这么一个“小问题”。

从某种程度来说,MySQL数据库性能优化的问题是一个并行的问题,归根结底是锁和资源争用的问题。举个例子:假设你要开一个餐饮店,你需要取好店名,到工商局领取开业登记注册证书,到卫生防疫站申请卫生许可,到物价局进行物价审核,如果要卖酒,则需要到工商部门办理酒类经营许可证,到税务局办理税务登记,到银行开户,还需要找厨师、找洗碗工、找采购人员、找门面、协调店面转让、进行店面装修、做广告牌,等等。

如果想尽快把餐饮店开起来,就需要同时做更多的事情,就像计算机一样,并行地去做更多的事情。但是当你真正去做这些事情的时候,会发现:

•总有一两件事情耗费的时间特别长,会最大程度地影响餐饮店什么时候能开起来。比如找到合适的店面或者合适的厨师。

•有些事情是相互依赖的,一件事情必须依赖于另一件事情的完成。比如工商登记就取决于你要准备好店名,店面装修依赖于门面已经租好了,等等。

•有些事情特别重要,它决定了这个餐饮店是否能长期经营下去。例如厨师做的菜是否足够好、足够快,运营的成本是否足够低而能产生足够的利润支撑餐饮店继续运营。

其实性能优化要做的就是以下事情:

•了解基本原理。找到事情的因果关系和依赖关系,让尽量不相关的事情能并行做起来。

•要事第一。找到当前最重要、最需要优化的地方,投入时间和精力,不断去改进它、优化它。

•切中要害。找到耗费时间最长的地方,想方设法缩短它的时间。

本书的作者尝试通过上述方法论来找到MySQL性能优化的办法并呈现给读者。

数据库的性能提升

从计算机出现的第一天起,性能作为鞭策者就不断地促进计算机及系统的演进。从最开始的人工输入命令等待计算机执行,到利用批处理任务提升利用率,再到通过多进程和多线程并发来进一步提升效率,性能其实一直是计算机工程师想要努力去解决和改善的重要难题。

上面说的都是对已有系统的性能优化,数据库的性能优化其实可以在做设计之前就开始了。

数据库的性能优化首先是计算机系统的优化。数据库程序是运行在计算机系统上的应用程序,需要先优化的就是计算机系统。也就是说,让硬件尽量均衡,操作系统充分发挥硬件的全部性能,而数据库充分利用操作系统和文件系统提供的便利发挥全部性能,而且避免资源的相互竞争。

数据库的性能优化其次是SQL语句的优化。上层应用都通过SQL语句与数据库打交道,一条SQL语句为了获取数据可以有几十甚至上百种执行计划,数据库会通过优化器选择更优的SQL执行计划,但是MySQL在执行计划上远远落后于商业数据库,甚至在一些方面相比PostgreSQL也差很多,那么怎么写出正确的SQL语句,避免MySQL选择错误的执行计划,以及怎样通过增加索引、设置参数让MySQL的执行计划更优,这就是优化SQL语句需要关心的事情。

最后,数据库的性能优化最有效的是架构的优化。对于读多写少的应用程序,可以设计为读写分离,把允许延迟的读请求主动分发到备库;对于秒杀型的业务,可以先在内存型key-value存储系统筛选再发往数据库持久化,避免对数据库的冲击;对于汇总、聚合类的应用,可以采用列式存储引擎或者专门的大数据平台;对于监控类的应用,可以采用时序数据库,等等。

以上三种优化思路贯穿本书,这也是本书名为《千金良方:MySQL性能优化金字塔法则》的缘由。

机械思维和大数据思维

看过吴军博士《智能时代:大数据与智能革命重新定义未来》的人可能会对本书嗤之以鼻,本书的性能优化方法论还是工业革命时代的机械思维,简而言之,就是寻找因果关系,大胆假设,小心求证。“现在都是信息时代了,了解过信息论没有?知道香农第一定律和第二定律吗?解决问题需要用大数据思维!”

笔者有两点理由使用机械思维来介绍数据库性能优化:(1)大数据时代需要的数据量大、多纬度和完备性,目前对数据库的性能优化和性能诊断,笔者掌握的案例和相关信息远远达不到大数据的要求。我们可以期待亚马逊、阿里云或者腾讯云等厂商或者专业的数据库公司(如Oracle、MariaDB等)来有针对性地做一些大数据数据库性能优化的尝试。(2)大数据的成本很高。目前我们遇到的大部分性能问题其实用因果关系和假设→推导→再假设→再推导的方法就可以解决,不需要用到大数据、人工智能这样的“大杀器”。

内容介绍

MySQL的火热程度有目共睹,如果需要了解MySQL的安装、启动、配置等基础知识,市面上相关的书籍已是汗牛充栋。本书则尽量深入细致地介绍MySQL的基本原理,以及性能优化的实际案例。

基本原理很枯燥,就像课堂上老师介绍数学定理和公式推导一样,有人可能会质疑,小学都在进行素质教育了,你这本书里怎么还有那么多基本原理的介绍?对于工作了两三年的技术人员来说,在实践上已经有了比较多的积累,解决过很多问题——可能通过sys schema查询事务锁等待解决了系统的并发问题,通过设置ulimit -n 扩大进程文件句柄数解决了MySQL的进程限制问题,通过设计读写分离架构扩展了应用的读性能线性扩展问题。但是作为求知欲强的技术人员,我们急切地希望知其所以然,了解MySQL到底是怎么设计的,以及为什么这样设计,sys schema到底还有哪些可以帮助我们分析解决问题的存储过程,Linux系统的资源限制除了ulimit还有哪些,读写分离架构适应的场景有哪些,什么时候建议用分库分表,等等。如果你也跟我们一样,你应该阅读本书。

本书一共分为3篇:基础篇、案例篇和工具篇。

信息论认为消除一件事情的不确定性就是获取足够多的信息。我们认为任何优化都可以从了解它的基本原理和设计思路开始。“基础篇”从理论基础和基本原理层面介绍了MySQL的安装与配置、升级和体系结构,information_schema、sys_schema、performance_schema和mysql_schema,MySQL复制,MySQL事务,SQL语句优化及架构设计基础知识。希望读者通过对这些内容的学习,能够深入细致地了解MySQL各方面的基础知识。

计算机是一种实验的科学,性能优化是实战的艺术。“案例篇”从硬件和系统、MySQL架构等方面给出了性能优化的十几个案例,包括:性能测试的基本优化思路和最需要关注的性能指标解释、对日常SQL语句执行慢的基本定位、避免x86可用性的一般性方法、节能模式会怎样影响性能、I/O存储作为数据库最重要的依赖是如何影响数据库性能的、主备复制不一致可能有哪些原因、字符集不一致会造成哪些性能问题、在实际场景中锁的争用是怎样的。希望读者通过这些案例,可以深入细致地理解“基础篇”中的各种概念,融会贯通,对MySQL有一个全面的、系统的掌握。“工欲善其事,必先利其器。”我们日常需要借助一些工具来做性能优化。“工具篇”介绍了在MySQL性能优化过程中需要用到的各种工具,包括:dmidecode、top、dstat等硬件和系统排查工具;FIO、sysbench、HammerDB等压力测试工具;mysqldump、XtraBackup等备份工具;Percona、innotop、Prometheus等监控工具。希望读者可以借助更多自动化的方式去验证和评估性能优化解决方案,提升性能。

读者对象(1)MySQL初学者。建议按照顺序从本书的“基础篇”开始阅读。“基础篇”介绍了从安装部署、基础配置到性能诊断等日常工作需要了解的内容。在熟悉了MySQL的基本概念和大致原理以后,在阅读“案例篇”时,对问题的定义和解决方案才能理解得更加透彻。最后在阅读“工具篇”时,也可以学习到MySQL DBA日常工作所需工具的使用方法和应用场景。(2)专门从事MySQL工作1~3年的开发人员和运维人员。对于有一些MySQL开发和运维经验的人员,建议先跳过“基础篇”,直接从“案例篇”开始阅读。在“案例篇”中了解了具体的问题现象、故障处理的过程和方法以后,联系案例中对应的“基础篇”和“工具篇”知识进行阅读,这样能帮助你把很多知识点串联起来,由点到面形成更为全面的MySQL知识体系。(3)资深的MySQL DBA。本书可以作为案头书,在解决问题时,如果记不清某些概念或者细节比较模糊,则可以拿来参考。

致谢

首先,感谢我的叔叔李巍,从一个贫家子弟到自己创业成立公司,到成为上市公司CEO,再到成立基金公司,他让我看到一个人的能力可以改变环境,让更多的人发挥自己的价值,也是他的经历激励着我继续努力。

其次,感谢阿里巴巴平台,在实际的工作中,这些之前一起奋斗过和现在正在一起奋斗的战友都给了我极大的帮助,他们是简朝阳、彭立勋、胡中泉、陈良允、陈栋、张瑞、熊中哲、何登成、梅庆、童家旺、李建辉、罗春、胜通、天羽、苏普等(排名不分先后)。

再次,感谢沃趣科技技术中心的负责人魏兴华,因为他的鼓励才有了这本书,感谢产品团队的负责人张文件、MySQL团队的同事刘云和沈刚帮助校稿,感谢市场部的同事杨雄飞、钱怡晨协调出版相关事宜。还要感谢其他在沃趣团队工作中一起成长的同学们,人数太多,这里就不一一提及了。

最后,感谢电子工业出版社的符隆美编辑大力配合我们推动图书的出版事宜。

本书作者

本书由李春、罗小波、董红禹共同编写,其中,李春负责编写第23~33章、第42~44章,罗小波负责编写第1~18章、第40~41章、第45~51章,董红禹负责编写第19~22章、第34~39章。

读者服务

微信扫码回复:37520

•获取免费增值资源

•获取精选书单推荐

•加入读者交流群,与更多读者互动编者基础篇

基础篇的内容设计,旨在为大家普及一些在性能优化过程中可能使用到的MySQL基础知识。为了方便大家对MySQL的体系结构和组件有一个整体认识,首先,完整介绍MySQL的安装、升级和整个体系组成结构,并介绍在MySQL运行过程中所有后台线程的作用;其次,由于在性能优化过程中需要依赖与表/索引相关的统计信息、事务锁和表级锁相关信息、在语句执行过程中的一些等待事件信息等,我们用14个章节重点介绍MySQL的4个系统库:information_schema、mysql、performance_schema、sys,通过这些系统库中记录的MySQL的状态和性能数据,读者可以更精确地定位问题的根源,甚至定位到源码的某一行;最后,除在MySQL复制、事务和SQL优化章节介绍MySQL自身的优化基础以外,还通过读写扩展的架构优化,抛砖引玉,希望引起读者对架构优化的思考。相信大家通过阅读基础篇的内容一定会有所收获。第1章 MySQL初始化安装、简单安全加固从这里开始,我们开启了本书的第一个章节。为了方便后续演示,以及照顾一些基础较为薄弱的读者,我们决定在本书中加入安装MySQL的章节,请大家准备好一台Linux服务器,跟随本章内容进行同步操作。1.1 背景

使用MySQL 5.6.35 二进制版本安装单实例。

操作系统使用CentOS 6.5 x64。

本章中提到了MySQL 5.7.x与5.6.x版本在安装步骤上的差异,稍做调整,本安装步骤也适用于5.7.x版本的安装。1.2 初始化安装1.2.1 下载二进制安装文件

使用wget下载MySQL 5.6.35二进制安装文件并存放在/root目录下。1.2.2 创建mysql用户

先创建mysql组,再创建mysql用户并加入mysql组中。1.2.3 创建程序、数据存放目录

按照如下路径规范创建MySQL的程序、数据存放路径。1.2.4 解压缩二进制安装文件并设置目录权限

把二进制安装文件解压缩到/home/mysql/program目录下,并修改程序、数据存放路径宿主、属组为mysql,使MySQL用户对这些目录和文件有完全访问权限。1.2.5 软链接程序路径,并设置MySQL命令环境变量

把/home/mysql/program/mysql-5.6.35-linux-glibc2.5-x86_64路径软链接到MySQL默认的程序访问路径/usr/local/mysql下,并把/usr/local/mysql/bin/添加到系统环境变量中,以便使用mysql相关命令时不需要输入绝对路径。1.2.6 配置my.cnf文件参数

把样例配置文件复制到/home/mysql/conf目录下,并设置好相关路径系统参数:socket、pid-file、datadir、tmpdir、log-error、slow_query_log_file、log-bin、relay-log、innodb_data_ home_dir、innodb_log_group_home_dir、innodb_undo_directory。1.2.7 初始化MySQL

使用mysql_install_db命令初始化MySQL数据字典库、ibdata1、log_file*等文件。提示:在MySQL 5.7版本中删除了mysql_install_db脚本,直接使用bin/mysqld命令进程初始化,初始化有两个选项。

• --initialize:使用该选项初始化时会在错误日志中写一个随机的root密码,初始化完成之后在错误日志中搜索password,紧跟其后的一串字符串就是这个随机密码(例如,“A temporary password is generated for root@localhost: XRER<:les9p?”这段文字中的粗体字部分就是随机密码),初始化完成并启动mysqld之后,初次登录需要使用这个随机密码。

• --initialize-insecure:使用该选项初始化时不会产生随机密码,而是像MySQL 5.7之前的版本一样,初始化完成之后,第一次登录数据库使用空的root密码。

示例:1.2.8 启动MySQL

将mysql.server文件复制到/etc/init.d/目录下,命名为mysqld程序,并使用这个脚本启动和停止MySQL。1.3 简单安全加固1.3.1 登录MySQL

MySQL 5.6.x初始化完成并启动之后,可以使用免密码的root用户登录MySQL,同时查看MySQL版本和登录用户是否是想要的结果。1.3.2 删除非root或非localhost的用户并修改root密码

在默认情况下,MySQL初始化完成之后,创建了一些默认用户:匿名用户、允许127.0.0.1和localhost登录的非root用户,建议删除这些无用且可能给数据库带来安全风险的用户。提示:MySQL安全加固也可以使用命令行工具mysql_secure_installation,根据提示一步一步执行即可。1.3.3 删除test库,清理mysql.db表

在默认情况下,MySQL 5.6.x初始化安装之后会生成一个测试用途的test库,这个库在生产环境中一般不需要使用,如果确定不使用,请删除。

在默认情况下,MySQL 5.6.x初始化完成MySQL之后,在mysql.db库级别权限表中会有针对test库的任意用户、任意地址的访问权限,即:无任何权限用户或匿名用户登录到MySQL中都可以对test库进行任意操作。因此,建议MySQL完成初始化安装之后,清理这些不安全的用户或删除mysql.db表中对test库预设的访问权限。提示:MySQL 5.7.x版本移除了test库,因此也就不存在删除test库这个步骤了。但如果有使用 test库的需要,则可自行创建。1.4 创建用户、库、表、数据

不要直接使用DML语句操作mysql.user表,而是要使用grant、revoke或者create user、drop user语句。如果必须要使用DML语句操作mysql.user表,那么请注意,在MySQL 5.7.x中password字段名称变更为了authentication_string。1.4.1 创建管理用户并授权

创建管理用户,并为这个管理用户授予任意地址访问的所有权限(包括with grant option权限)。1.4.2 创建库、表、程序账号

创建程序账号(在生产环境中不建议直接使用root账号,所以这里新建一个管理员账号,一个程序账号)。

程序账号一般给开发人员使用,给定权限推荐:create routine、alter routine、execute、select、delete、insert、update。

程序账号需要指定具体的库或表,且指定具体的访问来源。1.4.3 插入数据

使用程序账号登录MySQL,并插入数据。1.5 MySQL参数模板

在配置文件中会使用注释提示最新版本的变化。

下面给出MySQL 5.7配置文件参数模板。温馨提示:关于文中提到的参数的详细解释,可参考本书下载资源中的“附录C”。第2章 MySQL常用的两种升级方法在第1章中,我们介绍了如何安装MySQL,后续如果碰到版本有Bug,或者想用更新版本的新特性,那么就需要做升级的工作。本章将为大家介绍常用的两种MySQL升级方法,大家可以准备好一台Linux服务器,跟随本章内容进行同步操作。2.1 背景

使用MySQL 5.5.54 二进制版本安装单实例(5.5.x版本不支持innodb_undo_directory参数,请从配置文件中去掉),再使用MySQL 5.6.35二进制版本升级单实例。

操作系统使用CentOS 6.5 x64。提示:由于本章内容是试验性质的,所以选择本机直接升级,在生产环境中建议另外搭建一个实例环境,把备份数据拷贝过去执行升级。2.2 MySQL 5.5.54的安装

关于MySQL的安装,请参考1.2节内容。注意:• MySQL 5.5.x不支持innodb_undo_directory参数,请从配置文件中去掉。• MySQL 5.5.x初始化完成之后,不会产生ibdata1和ib_logfile*文件,启动时才产生。• MySQL 5.5.x的mysql_install_db是shell脚本,只支持在UNIX平台上使用,在MySQL 5.6.8版本之后使用Perl进行了改写,可以在任意安装了Perl语言的平台上使用。2.3 升级MySQL 5.5.54到MySQL 5.6.352.3.1 使用mysql_upgrade直接升级数据字典库

使用mysql_upgrade直接升级数据字典库,这种方式的升级不可跨越大版本。

1.停止MySQL 5.5.54

先查看sql_mode,记下它的值。

动态修改innodb_fast_shutdown=0,以执行full purge(当innodb_fast_shutdown=0时,MySQL在执行关闭mysqld进程时,会对不再需要的undo log page进行清理,该清理动作非人为触发)和插入缓冲合并等操作,以干净的方式关闭MySQL。

2.在my.cnf中添加skip_grant_tables参数

在my.cnf中添加skip_grant_tables参数,确保在执行升级前以不加载系统字典库的方式启动MySQL。

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载