mysql 表结构监控_性能测试之mysql监控、优化
共享表空间还有一个缺点就是不能自动收缩,自动收缩是什么意思呢,刚建表的时候,表里面数据很少,就1条数据,可能占用空间就几kb,到后来数据多了,占用了10个G的空间,然后发现有一些数据都是垃圾数据,删了5个G,那这个时候表空间就不会自动减小了,它还是10个G,浪费空间。
而独立表空间就是每个表的表空间都是独享的,用仓库这个例子就是每个货架都单独在一个房间里头,这样的话快递员去拿哪个东西,直接去那个房间里就好了,不用都挤在一个仓库里了。
而使用了独立的表空间,每个表都有自己的表空间,删了数据也会自动收缩,就不会有上面的问题了。
1
2
set globalinnodb_file_per_table=ON;设置独立表空间打开
showvariableslike'%per_table%';#查询是否打开独立表空间
读/写进程数配置
在mysql5.5之后读、写的进程数是可以配置的。默认读和写的进程数都是4个。
当然我们都知道,人多好干活嘛。进程多就是干活的人多,具体配置根据cpu的核数和业务逻辑来配置这两个值。
假如cpu是32核的,那么就是同时可以有32个进程在运行,就可以把这两个值给调大。
假如说是系统是一个内容类的网站,大多数操作都是读操作,那么就可以把读的进程数设置大一点,写的进程数设置的小一点。
怎么修改呢,找到mysql的配置文件,在[mysqld]节点下加入下面参数的即可
1
2
innodb_read_io_threads=5读进程数
innodb_write_io_threads=3写进程数
缓存配置
在说缓存配置之前咱们先了解清楚,计算机在处理任务的时候是怎么处理的,先从磁盘上读取数据,然后放到内存里面,cpu去内存里面拿数据,然后处理。
在写的时候正好相反,cpu处理完之后,把数据放到内存里面,内存再放到磁盘里。
那从上面,我们发现,如果数据直接从内存里面拿的话,那速度就快很多了,我们看下面的图,读1M的数据,内存里面比从磁盘上快多少。
从上面这个图我们发现从内存里面读数据比从磁盘里面取数据快了N倍。
那到mysql里面,如果取数据的时候,mysql先把一些数据缓存到内存里面的话,取数据直接从内存里面取不就快很多了。
咱们在说mysql缓存之前,先说下mysql在执行一条查询语句的时候都做了什么。
从上面的图我们发现,mysql是有两个地方检查了内存的。如果内存里面找到我们想要的数据,那么就不去磁盘上查询数据了。那么这两个缓存都是什么,怎么配置呢。
qcache配置
缓存完整的SELECT语句和查询结果,当查询命中缓存,MySQL会立刻返回结果,跳过解析、优化和执行阶段。
查询缓存会跟踪系统中的每张表,如果这些表发生变化,那么和这张表相关的所有查询缓存全部失效。
在检查查询缓存的时候,MySQL不会对SQL进行任何处理,它精确的使用客户端传来的查询(select),只要字符大小写,或者注释有一点点不同,查询缓存就认为是不同的查询。
任何一个包含不确定的函数(比如now(),current_date())的查询不会被缓存。
MySQL查询缓存可以改善性能,但是在使用的时候也有一些问题需要注意:
开启查询缓存对于读写都增加了额外的开销。对于读,在查询开始前需要先检查缓存;对于写,在写入后需要更新缓存。
一般情况这些开销相对较小,所以查询缓存一般还是有好处的。但也要根据业务特征权衡是否需要开启查询缓存。
怎么配置呢,找到mysql的配置文件,在[mysqld]节点下加入下面参数的即可
1
2
3
4
5
6
7
8
query_cache_size=200M
分配给查询缓存的总内存,一般建议不超过256M
query_cache_limit=1M
这个选项限制了MySQL存储的最大结果。如果查询的结果比这个大,那么就不会被缓存。
下面是查看qcache的状态的语句
SHOWVARIABLESLIKE'%query_cache%';#查看qcache状态
innodb_buffer_pool配置
mysql里面还有一个缓存配置就是innodb_buffer_pool的配置,innodb是现在mysql的默认存储引擎,存储引擎说白了就mysql存数据的时候到底是怎么存的。
就是一个仓库里面怎么摆放货物的。
buffer pool是innodb存储引擎带的一个缓存池,查询数据的时候,它首先会从内存中查询,如果内存中存在的话,直接返回,从而提高查询响应时间。
innodb buffer pool和qcache的区别是:qcacche缓存的是sql语句对应的结果集,buffer pool中缓存的是表中的数据。buffer pool一般设置为服务器物理内存的70%。
怎么配置呢,找到mysql的配置文件,在[mysqld]节点下加入下面参数的即可
1
2
3
4
5
innodb_buffer_pool_size=50M#Innodb_buffer_pool的大小
innodb_buffer_pool_dump_now=on#停止MySQL服务时,InnoDB将InnoDB缓冲池中的热数据保存到本地硬盘。
innodb_buffer_pool_load_at_startup=on#启动MySQL服务时,MySQL将本地热数据加载到InnoDB缓冲池中。
SHOW VARIABLES LIKE'%innodb_buffer_pool%';#查看buffer_pool的大小
mysql架构上的优化
读写分离
多点写入
数据库表结构优化
当然系统在设计表结构的时候,一般都是架构师和一帮开发已经把表结构设计好了,咱们没达到那个级别架构上的东西咱也不懂,就在设计表结构的时候需要注意的一些东西。
1、使用可以存下你的数据的最小数据类型
2、使用简单的数据类型,int类型和varchar类型上,mysql处理int类型更简单
3、尽可能的使用not null定义字段,可以为空的字段加上默认值
因为如果不限制not null的话,字段值是可以为空的,默认为空就是null,如果是not null的话字段值写空的话,就要写'',一个空的字符串。
null它在mysql里面也是要占用空间的,也不能利用索引,而空的字符串在mysql是不占用空间的,也可以利用索引。
4、时间类型的,用UNIX_TIMESTAMP,因为是int类型的
mysql索引优化
索引是什么呢,就和字典的目录一样。有目录了,那咱们查数据就快了。
最适合建索引的列是出现在where子句后面的列。
唯一索引的效果最好,因为是唯一的。
利用最左前缀。
索引并不是越多越好。
mysql索引有4种类型
1、普通索引
最普通的索引,所有列都可以加
1
create index index_name on table_name (col);
2、主键索引
建表的时候加的主键
3、组合索引
1
create index index_name on table_name (col,col2);
4、唯一索引
1
2
CREATE UNIQUE INDEX index_name
ON table_name(column_name);
去除重复、冗余索引
因为每个开发的水平都不一样,不可避免的的会出现一些重复索引的问题。那我们怎么来查找有一些冗余的索引呢。
就要借助percona-toolkit这个工具了,它里面有pt-duplicate-key-checker这个工具可以帮咱们找出来哪些表里面有冗余的索引,并给出修改索引的语句。
1
pt-duplicate-key-checker-uroot-pxxx-dxx#-u指的是用户 -p是密码 -d是数据库
这个能帮咱们找出来重复的索引,那还有一些根本就没有必要用的索引,虽然索引建立的并不是重复,但是实际上并没用查询语句用到它,怎么办呢,percona-toolkit这个工具里还有一个工具是pt-index-usage,它可以读取慢查询日志,帮咱们找到那些没用的索引。
1
pt-index-usage/opt/data/slow.log#后面是慢查询日志
慢查询日志
什么是慢查询日志呢,它这个就是个神器了,对咱们测试特别有帮助,它会记录执行时间长的sql语句,这样咱们找问题的时候就比较方便了。
1
2
3
4
5
6
7
set globalslow_query_log=on;#打开慢查询日志
set globallong_query_time=1;#设置记录查询超过多长时间的sql
set globalslow_query_log_file='/tmp/slow_query.log';#设置mysql慢查询日志路径,此路径需要有写权限
set globallog_queries_not_using_indexes=ON;#设置没有使用索引的sql记录下来
SHOWVARIABLESLIKE'%slow%';#查看慢查询配置
mysql记录的日志里面,咱们看着比较不清晰,咱们使用pt-query-digest这个工具帮咱们解析慢查询日志,它会把所有的sql的执行时间以及具体sql,执行了多少次都帮咱们统计出来。
下面是pt-query-digest的用法
1
2
3
pt-query-digest--filter='$event->{fingerprint} =~ m/^select/i'slow.log#查看包含select语句的慢查询
pt-query-digest--since=12hslow.log#最近12小时的
pt-query-digest--since'2017-12-01 09:30:00'--until'2017-12-02 10:00:00'--filter='$event->{fingerprint} =~ m/^select/i'slow.log#指定时间段
如果想实时的获取有没有执行时间长的sql,用下面这个sql语句
1
select id,`user`,`host`,DB,command,`time`,state,info from information_schema.PROCESSLIST where TIME>=60;
explain
通过慢查询日志我们可以找到有问题的sql语句,那我们怎么看这个sql哪有问题呢,就要使用explain了,只要在你要执行sql语句前面加上explain即可
all
sql优化时候需要注意的
查询条件使用索引列,排序使用索引列
避免select *,一般select * 都会造成全表扫描
尽量避免子查询,MySQL 的子查询执行计划一直存在较大的问题,虽然这个问题已经存在多年,但是到目前已经发布的所有稳定版本中都普遍存在,一直没有太大改善。虽然官方也在很早就承认这一问题,并且承诺尽快解决,但是至少到目前为止我们还没有看到哪一个版本较好的解决了这一问题。
事物
银行存钱例子。
锁
表级锁、行级锁。
SELECT * FROM information_schema.INNODB_TRX\G
mysql性能测试工具
mysqlslap是mysql自带的一个性能测试工具。它可以模拟各种并发,以及使用哪种sql,生成多少数据,运行多久,产生报告。
常用的选项
1
2
3
4
5
6
7
8
9
10
11
--concurrency 并发数量,多个可以用逗号隔开
--engines要测试的引擎,可以有多个,用分隔符隔开,如--engines=myisam,innodb
--auto-generate-sql 用系统自己生成的SQL脚本来测试
--auto-generate-sql-load-type 要测试的是读还是写还是两者混合的(read,write,update,mixed)
--number-of-queries总共要运行多少次查询。每个客户运行的查询数量可以用查询总数/并发数来计算
--debug-info额外输出CPU以及内存的相关信息
--number-int-cols创建测试表的int型字段数量
--number-char-cols 创建测试表的chat型字段数量
--create-schema测试的database
--query自己的SQL 脚本执行测试
--only-print如果只想打印看看SQL语句是什么,可以用这个选项
下面是使用的例子
1
2
3
4
5
6
7
8
100并发,运行1000次,写操作和读操作都有,自动生成sql,int类型字段2个,char类型10个,
mysqlslap-h127.0.0.1-uroot-p123456--concurrency=100--auto-generate-sql--auto-generate-sql-load-type=mixed--engine=innodb--auto-generate-sql-add-autoincrement--number-int-cols=2--number-char-cols=10--number-of-queries=10
100并发,运行5000次,besttest这个数据库上执行sql
mysqlslap-h127.0.0.1-uroot-p123456--concurrency=100--query='select * from stu;'-create-schema=besttest--engine=innodb--number-of-queries=5000--debug-info
100并发,运行5000次,besttest这个数据库上执行指定的sql文件
mysqlslap-h127.0.0.1-uroot-p123456--concurrency=100--query=/tmp/besttest.sql-create-schema=besttest--engine=innodb--number-of-queries=5000--debug-info
mysql 表结构监控_性能测试之mysql监控、优化相关推荐
- mysql查询性能测试工具_性能测试之数据库监控分析工具PMM
PMM(Percona Monitoring and Management) 是一个用于管理和监控数据库性能的开源平台. . 它能提供全面的基于时间和各类监控指标.计数器的分析. 性能测试中,是做数据 ...
- 由浅入深探究mysql索引结构原理_性能分析与优化_由浅入深探究mysql索引结构原理、性能分析与优化...
由浅入深探究mysql索引结构原理.性能分析与优化 第一部分:基础知识第二部分:MYISAM和INNODB索引结构1, 简单介绍B-tree B+ tree树 2, MyisAM索引结构 3, Ann ...
- mysql表的类型_浅谈MySQL表类型
MySQL为我们提供了很多表类型供选择,有MyISAM.ISAM.HEAP.BerkeleyDB.InnoDB,MERGE表类型,萝卜白菜各有所爱是不假,可是真正选择何种表类型还是要看业务需要啊,每一 ...
- mysql表空间大小_浅谈mysql中各种表空间(tablespaces)的概念
mysql中,会涉及到各种表空间的概念,虽然,很多方面这些概念和Oracle有相似性,但也有很多不同的地方,初学者很容易被这些概念弄的晕头转向,从而,混淆这些概念的区别和理解,下面,就简要介绍和说明一 ...
- mysql 表结构反转_一道经典的MySQL面试题,答案出现三次反转
前几天偶然看到大家在讨论一道面试题,而且答案也不够统一,我感觉蛮有意思,在此就做一个解读,整个过程中确实会有几处反转. 我们先来看下题目: 一张表,里面有ID自增主键,当insert了17条记录之后, ...
- ogg mysql表结构不一致_求助:OGG双向同步,数据不一致如何解决?(已解决)
本帖最后由 hbm1985 于 2012-5-10 07:39 编辑 本人在搭建oracle goldengate 双向同步时,遇到一个问题:当两边同时更新同一条记录时,会出现两边数据不一致的问题. ...
- mysql存储过程结构体_八、mysql视图、存储过程、函数以及时间调度器
1.create or replace view emp_view as select * fromt4 ;给t4表创建一个名为emp_view的视图2.drop viewemp_view 删除视图= ...
- mysql表连接算法_如何在MySQL中连接多个表
我需要FULL OUTER JOIN多个表.我知道如何从 here开始加入两个表.但我有几个表,我不能将它们应用于它们.我怎样才能实现它? 我的SQL代码,如下: INSERT INTO table ...
- nagios监控 mysql 表结构
引言 为了给客户演示对mysql表结构的监控,在搜了很久之后发现不得不自己写一个脚本了.percona这么牛B的公司竟然没有提供一个这方面的工具,看来客户的要求有点花儿不实啊...这个问题一共花费了我 ...
最新文章
- 机器学习特征工程之连续变量离散化:聚类法进行分箱
- 网络常见的 9 大命令
- 无可奈何花落去,数据丢失时时来;何当共谈完整性,却话巴山夜雨时----详解SQL Server 数据库库完整性检查和置疑修复
- 图像处理之基础---图像高效不失真缩放既卷积应用
- 在Jupyter Notebook中运行R (附一系列疑难解答)
- Qt——消息对话框的设计
- 【LeetCode】【字符串】题号:*165. 比较版本号
- 企业如何避免创新者的窘境
- Elasticsearch-7(全文搜索应用分享)
- 易臣督查督办全覆盖 过程全留痕 政令全通达
- 浅谈知识付费模式的兴起及意义
- python爬取股票信息_利用Python爬取网易上证所有股票数据(代码
- EDA程序设计--计时器设计
- 启动项中删除微PE工具箱
- 视频播放 (二) 自定义 MediaPlayer
- 前端字体图标的使用(阿里、icomoon)
- N后问题详解(回溯法)--Java实现
- 艾创科技机器人_临沂艾创机器人
- 2020.8.26丨全长转录组测序产品概述
- 实变函数自制笔记8:初识勒贝格积分
热门文章
- 解决docker中运行scrapy使用chrome selenium报错InvalidSessionIdException: Message: invalid session id
- 解决python报错写入文件 io.UnsupportedOperation: not writable
- python判断一个日期对应的节假日名
- oracle分布式事物锁,ORA-02049:超时:分布式事务处理等待锁诊断-Oracle
- cpp怎么转成html,如何编辑HTML(标签),通过CppWebBrowser
- @RequestParam用法与@PathVariable用法的区别
- 《软件工程》课程改进意见
- Spark SQL运行原理和架构
- Linux 文件 目录
- (30)System Verilog进程间同步(邮箱mailbox)