MySQL数据库优化(一)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
日志服务 SLS,月写入数据量 50GB 1个月
简介: MySQL数据库优化(一)

1.1.1. 慢查询日志


当查询超过一定的时间没有返回结果的时候,才会记录到慢查询日志中。默认不开启。

采样的时候手工开启。可以帮助我们找出执行慢的 SQL 语句


查看慢 SQL 日志是否启用(on 表示启用):


show variables like 'slow_query_log';


查看执行慢于多少秒的 SQL 会记录到日志文件中


show variables like 'long_query_time';


可以使用模糊搜索,查看所有含有 query 的变量信息


show variables like '%query%';

 

1.1.2. 修改 l mysql 配置参数


my.ini(Linux 下文件名为 my.cnf),查找到[mysqld]区段,增加日志的配置。

Windows 下路径一般为 C:\ProgramData\MySQL\MySQL Server 5.7\my.ini",可以在

启动参数中查看使用的是那个配置文件。

 

常用的参数详解:


#--是否开启慢查询日志


slow_query_log=1


# --指定保存路径及文件名,默认为数据文件目录,


slow_query_log_file="bxg_mysql_slow.log"


# --指定多少秒返回查询的结果为慢查询


long_query_time=1


# --记录所有没有使用到索引的查询语句


log_queries_not_using_indexes=1


#--记录那些由于查找了多于 1000 次而引发的慢查询


min_examined_row_limit=1000


# --记录那些慢的 optimize table,analyze table 和 alter table 语句


log_slow_admin_statements=1


#--记录由 Slave 所产生的慢查询


log_slow_slave_statements=1


datadir=C:/ProgramData/MySQL/MySQL Server 5.7\Data --数据文件目录

注意:修改以下参数,需要重新启动数据库服务才会生效。

 

1.1.3. 命令行修改慢查询配置


命令行修改配置方式不需要不重启即可生效,但重启之后会自动失效。


set global slow_query_log=1;


set global slow_query_log_file='bxg_mysql_slow.log';


set long_query_time=1;


set global log_queries_not_using_indexes=1;


set global min_examined_row_limit=1000;


set global log_slow_admin_statements=1;


set global log_slow_slave_statements=1;


其他参数可通过以下命令查阅:


show variables like '%query%';


show variables like '%slow%';


 

1.1.4. 慢日志格式


时间、主机信息、执行信息、执行时间、执行内容

 

1.1.5. 查询缓存


Query Cache 会缓存 select 查询,安装时默认是开启的,但是如果对表进行 INSERT,
UPDATE, DELETE, TRUNCATE, ALTER TABLE, DROP TABLE, or DROP DATABASE 等操作
时,之前的缓存会无效并且删除。这样一定程度上也会影响我们数据库的性能。所以对一
些频繁的变动表的情况开启缓存是不明智的。还有一种情况我们测试数据库性能的时候也
要关闭缓存,避免缓存对我们测试数据的影响。


show VARIABLES like '%cache%';


查看缓存命中情况


select count(*) FROM test;


select count(*) FROM test;


show status like '%qcache%';

 

关闭缓存有两种放法,一种临时的,一种永久的。临时的直接在命令行执行


set global query_cache_size=0;

 

set global query_cache_type=0; --如果配置文件中为关闭缓存的话,不能通过命令开启缓存


永久的修改配置文件 my.cnf ,添加下面的配置即可。


query_cache_type=0


query_cache_size=0


另外,我们还可以通过 sql_no_cache 关键字在 sql 语句中直接禁用缓存,在开启缓存
的情况下我们对 sql 语句做一些改动


Select sql_no_cache count(*) from pythonlearn.lianjia; -- 不缓存


Select sql_cache count(*) from pythonlearn.lianjia; -- 缓存(也可以不加,默认缓存已经开启了)

 

1.1.6. 准备测试数据


创建测试表


-- 用户表
CREATE TABLE `person` (
`id` bigint(20) unsigned NOT NULL,
`fname` varchar(100) NOT NULL,
`lname` varchar(100) NOT NULL,
`age` tinyint(3) unsigned NOT NULL,
`sex` tinyint(1) unsigned NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8
--用户部门表
CREATE TABLE `department` (
`id` bigint(20) unsigned NOT NULL,
`department` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8
-- 用户住址表
CREATE TABLE `address` (
`id` bigint(20) unsigned NOT NULL,
`address` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8


创建存储过程,用于批量添加测试数据


delimiter $$


drop procedure if exists generate;


CREATE DEFINER=`root`@`localhost` PROCEDURE `generate`(IN num INT)

BEGIN

 

DECLARE chars VARCHAR(100) DEFAULT


'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';


DECLARE fname VARCHAR(10) DEFAULT '';


DECLARE lname VARCHAR(25) DEFAULT '';


DECLARE id int UNSIGNED;


DECLARE len int;


set id=1;


DELETE from person;


WHILE id <= num DO


set len = FLOOR(1 + RAND()*10);


set fname = '';


WHILE len > 0 DO


SET fname = CONCAT(fname,substring(chars,FLOOR(1 + RAND()*62),1));


SET len = len - 1;


END WHILE;


set len = FLOOR(1+RAND()*25);


set lname = '';


WHILE len > 0 DO


SET lname = CONCAT(lname,SUBSTR(chars,FLOOR(1 + RAND()*62),1));


SET len = len - 1;


END WHILE;


INSERT into person VALUES (id,fname,lname, FLOOR(RAND()*100),


FLOOR(RAND()*2));


set id = id + 1;


END WHILE;


END $$


delimiter $$


drop procedure if exists genDepAdd;


CREATE DEFINER=`root`@`localhost` PROCEDURE `genDepAdd`(IN num INT)

BEGIN


DECLARE chars VARCHAR(100) DEFAULT '行政技术研发财务人事开发公关推广营销咨询客服


运营测试';


DECLARE chars2 VARCHAR(100) DEFAULT '北京上海青岛重庆成都安徽福建浙江杭州深圳温


州内蒙古天津河北西安三期';


DECLARE depart VARCHAR(10) DEFAULT '';


DECLARE address VARCHAR(25) DEFAULT '';


DECLARE id int UNSIGNED;


DECLARE len int;


set id=1;


WHILE id <= num DO


set len = FLOOR(2 + RAND()*2);


set depart = '';


WHILE len > 0 DO


SET depart = CONCAT(depart,substring(chars,FLOOR(1 + RAND()*26),1));


SET len = len - 1;


END WHILE;


set depart=CONCAT(depart,'部');


set len = FLOOR(6+RAND()*18);


set address = '';


WHILE len > 0 DO


SET address = CONCAT(address,SUBSTR(chars2,FLOOR(1 + RAND()*33),1));


SET len = len - 1;


END WHILE;


INSERT into department VALUES (id,depart);


INSERT into address VALUES (id,address);


set id = id + 1;


END WHILE;


END $$


为了提高速度,可以暂停事务。测试添加 100 万随机数据,大概 600s 左右时间。

-- 停掉事务


set autocommit = 0;


-- 调用存储过程


call generate(1000000);


-- call genDepAdd(1000000);


-- 重启事务


set autocommit = 1;


 

对比 MyIsam:当创建表时选择 MyIsam 格式,插入数据会很慢,仅仅 3000 条数据就

需要 2 分钟的时间,由此可见 MyIsam 和 InnoDB 的差距还是很大的。另外在执行过程中可以发现 MyIsam 插入的数据可以在表中实时看到,而 InnoDB 做了事务最终一次提交,


所以数据不能实时看到,只有存储过程全部执行完成后才可以看到数据

 

 

未完待续

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
8天前
|
关系型数据库 MySQL Linux
MySQL原理简介—6.简单的生产优化案例
本文介绍了数据库和存储系统的几个主题: 1. **MySQL日志的顺序写和数据文件的随机读指标**:解释了磁盘随机读和顺序写的原理及对数据库性能的影响。 2. **Linux存储系统软件层原理及IO调度优化原理**:解析了Linux存储系统的分层架构,包括VFS、Page Cache、IO调度等,并推荐使用deadline算法优化IO调度。 3. **数据库服务器使用的RAID存储架构**:介绍了RAID技术的基本概念及其如何通过多磁盘阵列提高存储容量和数据冗余性。 4. **数据库Too many connections故障定位**:分析了MySQL连接数限制问题的原因及解决方法。
|
11天前
|
SQL 关系型数据库 MySQL
MySQL进阶突击系列(07) 她气鼓鼓递来一条SQL | 怎么看执行计划、SQL怎么优化?
在日常研发工作当中,系统性能优化,从大的方面来看主要涉及基础平台优化、业务系统性能优化、数据库优化。面对数据库优化,除了DBA在集群性能、服务器调优需要投入精力,我们研发需要负责业务SQL执行优化。当业务数据量达到一定规模后,SQL执行效率可能就会出现瓶颈,影响系统业务响应。掌握如何判断SQL执行慢、以及如何分析SQL执行计划、优化SQL的技能,在工作中解决SQL性能问题显得非常关键。
|
2月前
|
SQL 关系型数据库 MySQL
深入解析MySQL的EXPLAIN:指标详解与索引优化
MySQL 中的 `EXPLAIN` 语句用于分析和优化 SQL 查询,帮助你了解查询优化器的执行计划。本文详细介绍了 `EXPLAIN` 输出的各项指标,如 `id`、`select_type`、`table`、`type`、`key` 等,并提供了如何利用这些指标优化索引结构和 SQL 语句的具体方法。通过实战案例,展示了如何通过创建合适索引和调整查询语句来提升查询性能。
346 9
|
3天前
|
缓存 算法 关系型数据库
MySQL底层概述—8.JOIN排序索引优化
本文主要介绍了MySQL中几种关键的优化技术和概念,包括Join算法原理、IN和EXISTS函数的使用场景、索引排序与额外排序(Using filesort)的区别及优化方法、以及单表和多表查询的索引优化策略。
MySQL底层概述—8.JOIN排序索引优化
|
4天前
|
SQL 关系型数据库 MySQL
MySQL底层概述—7.优化原则及慢查询
本文主要介绍了:Explain概述、Explain详解、索引优化数据准备、索引优化原则详解、慢查询设置与测试、慢查询SQL优化思路
MySQL底层概述—7.优化原则及慢查询
|
4天前
|
存储 缓存 关系型数据库
MySQL底层概述—5.InnoDB参数优化
本文介绍了MySQL数据库中与内存、日志和IO线程相关的参数优化,旨在提升数据库性能。主要内容包括: 1. 内存相关参数优化:缓冲池内存大小配置、配置多个Buffer Pool实例、Chunk大小配置、InnoDB缓存性能评估、Page管理相关参数、Change Buffer相关参数优化。 2. 日志相关参数优化:日志缓冲区配置、日志文件参数优化。 3. IO线程相关参数优化: 查询缓存参数、脏页刷盘参数、LRU链表参数、脏页刷盘相关参数。
MySQL底层概述—5.InnoDB参数优化
|
6天前
|
关系型数据库 MySQL 数据库
从MySQL优化到脑力健康:技术人与效率的双重提升
聊到效率这个事,大家应该都挺有感触的吧。 不管是技术优化还是个人状态调整,怎么能更快、更省力地完成事情,都是我们每天要琢磨的事。
56 23
|
6天前
|
SQL 关系型数据库 MySQL
MySQL原理简介—11.优化案例介绍
本文介绍了四个SQL性能优化案例,涵盖不同场景下的问题分析与解决方案: 1. 禁止或改写SQL避免自动半连接优化。 2. 指定索引避免按聚簇索引全表扫描大表。 3. 按聚簇索引扫描小表减少回表次数。 4. 避免产生长事务长时间执行。
|
23天前
|
监控 关系型数据库 MySQL
Aurora MySQL负载突增应对策略与优化方案
通过以上策略,企业可以有效应对 Aurora MySQL 的负载突增,确保数据库在高负载情况下依然保持高性能和稳定性。这些优化方案涵盖了从架构设计到具体配置和监控的各个方面,能够全面提升数据库的响应速度和处理能力。在实际应用中,应根据具体的业务需求和负载特征,灵活调整和应用这些优化策略。
50 22
|
28天前
|
缓存 NoSQL JavaScript
Vue.js应用结合Redis数据库:实践与优化
将Vue.js应用与Redis结合,可以实现高效的数据管理和快速响应的用户体验。通过合理的实践步骤和优化策略,可以充分发挥两者的优势,提高应用的性能和可靠性。希望本文能为您在实际开发中提供有价值的参考。
55 11

热门文章

最新文章