《高性能MySQL》第6章 查询性能优化
减少不必要数据的访问 在优化查询的最先考虑的是我们是否从数据库中取出不必要的数据,也就是SELECT *是否有必要?取出全部列,会让优化器无法完成索引覆盖扫描这类优化,还会为服务器带来额外的I/O、内存和CPU的消耗。
小表驱动大表1SELECT * FORM A WHERE EXISTS(SELECT 1 FROM B WHERE B.id = A.id)
等价于
12SELECT * FROM ASELECT * FROM B WHERE B.id = A.id
当A表的数据集小于B表的数据集时,用EXISTS优于IN。
切分查询 如果用一个大的语句一次性完成的话,则能一次锁住很多数据、占满整个事务日志、耗尽系统资源、阻塞很多 小的但很重要的查询,此时就需要把原来的查询语句切分,或者限制原本查询语句将影响的行数,并多次执行该语句,以降低对系统资源的消耗。
1DELETE FROM messages WHERE created < DATE_SUB(NOW(),INTERVAL 3 MONTH);
可以被切分成
12345row_affec ...
《高性能MySQL》第5章创建高性能索引 III
在InnoDB表中按主键顺序插入行 在主键的问题上,最简单也是大多数情况下最适用的方法就是使用AUTO_INCREMENT列。这样保证了数据行是按顺序写入的,对于根据主键做关联操作的性能也会更好。
最好避免随机的(不连续且值的分布范围非常大)聚簇索引,特别是对I/O密集型的应用,例如,从性能的角度考虑,使用UUID来作为聚簇索引是一个很糟糕的选择:它使得聚簇索引的插入变得完全随机,每次插入数据都有可能会重构主键索引树,不仅仅是性能的损失,用UUID做主键还会导致索引变得很大,因为InnoDB的二级索引的叶子节点保存的是索引值+该索引值对应的主键。另一个造成索引很大的原因是因为页分裂和碎片。由于写入是乱序的InnoDB不得不频繁的做页分裂操作(把数据从原本的位置上向后移动,为新数据的插入创造空间)。
但是AUTO_INCERMENT并不是银弹,在高并发的情况下,数据大量写入,InnoDB的主键插入顺序可能会造成明显的争用,主键的上界成为“热点”。因为所有的插入都发生在这里,所以并发插入可能会导致间隙锁竞争。在应用层解决这个问题的选择之 ...
《高性能MySQL》第5章 创建高性能索引 Ⅱ
索引列顺序取决于使用该索引的查询,在一个多列B-Tree索引中,索引列的顺序意味着索引首先按照最左列进行排序,其次是第二列,等等。所以索引可以按照升序或者降序进行扫描,以满足精确符合列顺序的ORDER BY、GROUP BY和DISTINCT等子句的查询需求。评价一个索引是否高效,可以从三个方面来进行考察,索引是否将相关记录放在一起;索引中的数据顺序和查找的排列顺序是否一致;索引中的列是否包含了查询中需要的全部列。根据这三个方面可以得出,以下情况会导致索引失效:
违背最左前缀法则。
在索引列上做了操作(计算、函数、(自动或手动)类型转换),会导致全表扫描。
范围条件右边的列上的索引全部失效。
使用SELECT *,此时一般都是全表扫描。
使用!=或者<>的时候无法使用索引会导致全表扫描。
IS NULL,IS NOT NULL 也无法使用索引。
使用LIKE子句时以通配符开头(LIKE ‘%abc’)此时会变成全表扫描。
字符串不加单引号会导致索引失效。
使用OR时,索引有时也会失效。
一般判断一条查询是否使用到了索引可以使用EXPLAIN关键字来查 ...
《高性能MySQL》第5章 创建高性能索引 Ⅰ
索引是存储引擎用于快速找到纪录的一种数据结构。常见的索引有:
B-Tree索引B-Tree索引的具体实现取决于存储引擎,比如MyISAM引擎的B-Tree索引使用了前缀压缩技术,让索引更小,而InnoDB则按照原数据格式进行存储。这里讲一下MyISAM的B+树索引和InnoDB的B+树索引有什么区别。在MyISAM中一张表由三个文件组成.frm文件存储表结构.myi和.myd存储索引和数据。MyISAM的主键索引树中叶子节点保存了主键值和指向列值的文件指针,二级索引也是如此,也就是说不管在查询中利用到了主键索引还是二级索引,都可以直接拿到文件指针,进而取到数据。InnoDB采用聚簇索引,即数据和索引保存在同一个文件中,所以InnoDB表只包含.frm文件和.ibd文件。它的主键索引树的叶子节点保存了主键值和对应的全部数据。二级索引树的叶子节点包含该条索引的列值和主键,所以在利用到二级索引的时候需要再查一遍主键索引树才能拿到数据(如果查询的是主键值则不需要这一步)。采用聚簇索引的好处有:
可以把相关数据都保存在一起,减少了I/O次数。
数据访问更快,索引和数据都在一个B-Tree中,因 ...
《高性能MySQL》第4章 Schema与数据类型优化
Schema与数据类型优化 在选择数据类型的过程中需要遵守以下原则
更小的通常更好
一般情况下,应尽量使用可以正确存储数据的最小类型。更小的数据类型通常更快,因为它们占用更少的磁盘、内存和CPU缓存
简单就好
简单的数据类型的操作通常需要更少的CPU周期。例如,整型比字符操作代价更低,因为字符集和校对规则(排序规则)使字符比较比整形比较更复杂。
尽量避免NULL
如果查询中包含可能为NULL的列,对MySQL来说更难优化,因为可为NULL的列使得索引、索引统计和值比较都更复杂。可为NULL的列会使用更多的存储空间,在MySQL中也要被特殊处理。当可为NULL的列被索引时,每个索引记录需要一个额外的字节。简言之,如果要建立索引应当避免包含可为NULL的列。
MySQL中各数据类型的特点整数类型 整数类型包括TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT。分别用8、16、24、32、64位存储空间。有一个有意思的地方在规定整数类型宽度的时候比如INT(5),实际上不会限制值的合法范围,它只会限制我们在使用MySQL交互工具时显 ...
《高性能MySQL》第1章
MySQL的隔离级别
READ UNCOMMITTED(未提交读)
在READ UNCOMMITTED级别,事务中的修改,即使没有提交,对其他事务也都是可见的。事务可以读取未提交的数据,这也称为脏读(Dirty Read)。这个级别会导致很多问题,从性能上来说,READ UNCOMMITTED不会比其他级别好太多,但缺乏其他级别的很多好处,除非真的有非常必要的理由,在实际应用中一般很少使用。
READ COMMITTED(提交读)
大多数数据库系统的默认隔离级别都是READ COMMITTED(但MySQL不是)。READ COMMITTED满足前面提到的隔离性的简单定义:一个事务开始时,只能“看见”已经提交事务所做的修改,换句话说,一个事务从开始直到提交之前,所做的任何修改对其他事务都是不可见的,这个级别有时候也叫做不可重复读(Nonrepeatable Read),因为两次执行同样的查询可能会得到不一样的结果。
REPEATABLE READ(可重复读)
REPEATABLE READ解决了脏读的问题。该级别保证了在同一个事务中多次读取同样纪录结果是一致的。但理论上,可重复读隔 ...
Kubernetes-ELK部署
前情回顾
新一代容器云监控系统P+G
Exporters(可以自定义开发)
HTTP接口
定义监控项和监控项的标签(维度)
按一定的数据结构组织监控数据
以时间序列被收集
Prometheus Server
Retrieve(数据收集器)
TSDB(时间序列数据库)
Configure(static_config、kubernetes_sd、file_sd)
HTTP Server
Grafana
多种多样的插件
数据源(Prometheus)
Dashboard(PromQL)
Alertmanager
rules.yml(PromQL)
ELK Stack概述
日志,对于任何系统来说都是及其重要的组成部分。在计算机系统里面,更是如此。但是由于现在的计算机系统大多比较复杂,很多系统都不是在一个地方,甚至都是跨国界的;即使是在一个地方的系统,也有不同的来源,比如,操作系统,应用服务,业务逻辑等等。他们都在不停的产生各种各样的日志数据。根据不完全统计,我们全球每天大约要产生2EB的数据。
K8S系统里的业务应用是高度“动态化”的,随着容器编排的进行,业务容器在不断 ...
Kubernetes-Prometheus部署
前情回顾
配置是独立于程序的可配变量,同一份程序在不同配置下会有不同的行为。
云原生(Cloud Native)程序的特点
程序的配置,通过设置环境变量传递到容器内部
程序的配置,通过程序启动参数配置生效
程序的配置,通过集中在配置中心进行统一管理(CRUD)
Devops工程师应该做什么?
容器化公司自研的应用程序(通过Docker进行二次封装)
推动容器化应用,转变为云原生应用(一次构建,到处使用)
使用容器编排框架(kubernetes),合理,规范,专业的编排业务容器
新一代容器云监控Prometheus的概述
https://prometheus.io
https://github.com/prometheus
prometheus架构图
新一代容器云监控系统Prometheus和传统监控Zabbix对比
实战部署容器云监控必备exporter部署kube-state-metrics运维主机shkf-245.host.com
准备kube-state-metrics镜像kube-state-metrics官方quay.io地址
12345[ ...
Mock.js
什么是Mock.jsMock.js (官网http://mockjs.com/)是一款模拟数据生成器,旨在帮助前端工程师独立于后端进行开发,帮助编写单元测试。提供了以下模拟功能:
根据数据模板生成模拟数据。
模拟 Ajax 请求,生成并返回模拟数据。
基于 HTML 模板生成模拟数据。
Mock.js具有以下特点:
前后端分离。
增加单元测试的真实性。
通过随机数据,模拟各种场景。
开发无侵入。
不需要修改既有代码,就可以拦截 Ajax 请求,返回模拟的响应数据。
用法简单。
符合直觉的接口。
数据类型丰富
支持生成随机的文本、数字、布尔值、日期、邮箱、链接、图片、颜色等。
方便扩展
支持支持扩展更多数据类型,支持自定义函数和正则。
Mock.js安装 在命令提示符下用npm安装mockjs
1cnpm install mockjs
快速入门需求:生成列表数据,数据条数为5条。显示效果如下:
123456789101112131415161718192021222324{ "list": [ { "id": 1, "name": ...
深入探究RESTful风格
RESTful架构,就是目前最流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。REST这个词,是Roy Thomas Fielding在他2000年的博士论文中提出的。 Fielding是一个非常重要的人,他是HTTP协议(1.0版和1.1版)的主要设计者、Apache服务器软件的作者之一、Apache基金会的第一任主席。所以,他的这篇论文一经发表,就引起了关注,并且立即对互联网开发产生了深远的影响。Fielding将他对互联网软件的架构原则,定名为REST,即Representational State Transfer的缩写。我对这个词组的翻译是”表现层状态转化”。如果一个架构符合REST原则,就称它为RESTful架构。
理解RESTful架构 要理解RESTful架构,最好的方法就是去理解Representational State Transfer这个词组到底是什么意思,它的每一个词代表了什么涵义。
(1)资源(Resources)
REST的名称”表现层状态转化”中, ...