mysql查询时间区间的数据
前言最近在做项目涉及到Mysql的复杂日期查询,日期查询其实在数据库中查询其实还是用得挺多的,比如查询开始日期到结束日期的区间信息,查询日期小于有效日期的信息,查询当天的日期,明天的日期,做比较等。查...
2024.11.21早上客户反应,其网站无法访问,无限转圈
上服务器,查看磁盘空间df -h,内存使用率free -m,网络流量iftop均正常
然后使用top查看时,发现mysql的cpu使用率上升到200%。
解决过程回放进入mysql
查看正在执行的sql
mysql> use information_schema;Reading table information for completion of table and column namesYou can turn off this feature to get a quicker startup with -ADatabase changedmysql> select * from PROCESSLIST where info is not null;+-----+------+-----------+--------------------+---------+------+-----------+--------------------------------------------------+| ID| USER | HOST| DB | COMMAND | TIME | STATE | INFO |+-----+------+-----------+--------------------+---------+------+-----------+--------------------------------------------------+| 291 | root | localhost | information_schema | Query|0 | executing | select * from PROCESSLIST where info is not null |+-----+------+-----------+--------------------+---------+------+-----------+--------------------------------------------------+1 row in set (0.00 sec)mysql>并没有发现有任何的异样,没有出现锁表状况
然后查看tmp_table_size的大小
mysql> show variables like ‘%table_size%‘;+---------------------+-----------+| Variable_name| Value |+---------------------+-----------+| max_heap_table_size | 16777216 || tmp_table_size| 16777216 |+---------------------+-----------+2 rows in set (0.00 sec)确认两个值大小均为16M(安装的是mariadb 5.5)
查看free -m还有4G大小的内存,此处显得过小,将其一个值提升到500M,一个值提升至200M
[root@iZbp16s0cap5fnfk6bjvw1Z ~]# grep -v ^# /etc/my.cnf | grep -v ^$[mysqld]datadir=/var/lib/mysqlsocket=/var/lib/mysql/mysql.socktmp_table_size=200Mmax_heap_table_size=500M然后重启mysql
发现top的中mysql的cpu占用率使用已经大大下降,已经恢复至20%左右
事后总结mysql cpu占用率很高,很有可能是因为查询时死表,或者说大量多表查询,导致cpu飚高。
另外也有可能是因为tmp_table_size过大,超出了mysql的内存大小使用设定,mysql会将一些table写入到磁盘中,这样也会大大引起cpu的使用率增大
在select * from PROCESSLIST where info is not null中没有发现异样时,即可以推断另外一种的可能。
在mysql的官方文档中是这样写的
Storage Engines Used for Temporary TablesAn internal temporary table can be held in memory and processed by the MEMORY storage engine, or stored on disk and processed by the MyISAM storage engine.If an internal temporary table is created as an in-memory table but becomes too large, MySQL automatically converts it to an on-disk table. The maximum size for in-memory temporary tables is determined from whichever of the values of tmp_table_size and max_heap_table_size is smaller. This differs from MEMORY tables explicitly created with CREATE TABLE: For such tables, only the max_heap_table_size system variable determines how large the table is permitted to grow and there is no conversion to on-disk format.翻译过来的大意是,当tmp_table变得越来越大的时候,msql tmp_table使用内存最大值为tmp_table_size与max_heap_table_size两者中较小的值。
而最后一句话特别的重要,当create table的时候(mysql临时表使用内存肯定会增加),max_heap_table_size才是决定临时表能创建多少的值。
所以一般max_heap_table_size要大于tmp_table_size
mysql> show global status like "%created_tmp%";+-------------------------+-------+| Variable_name| Value |+-------------------------+-------+| Created_tmp_disk_tables | 1654|| Created_tmp_files| 6 || Created_tmp_tables| 1791|+-------------------------+-------+3 rows in set (0.00 sec)查看临时tables的实时数量
每次创建临时表,Created_tmp_tables增加,如果临时表大小超过tmp_table_size,则是在磁盘上创建临时表,但是其大小不能超过max_heap_table_size
前言最近在做项目涉及到Mysql的复杂日期查询,日期查询其实在数据库中查询其实还是用得挺多的,比如查询开始日期到结束日期的区间信息,查询日期小于有效日期的信息,查询当天的日期,明天的日期,做比较等。查...
2024.11.21判断数据库某表或某字段是否存在,也是我们实际应用中经常进行的一种操作,本文将介绍如何在 MySQL、Oracle、PostgreSql 数据库中判断表或字段是否存在。MySQL数据库判断 MySQL ...
2024.11.21很想学习下mysql数据库的知识,毕竟现在用的很多开源CMS都是用的mysql数据库,比如本站使用的wordpress,在这些CMS使用过程中避免不了的会用到一些MySql知识,因此博主最近收集整理了...
2024.11.201. MySQL查询慢是什么体验?大多数互联网应用场景都是读多写少,业务逻辑更多分布在写上。对读的要求大概就是要快。那么都有什么原因会导致我们完成一次出色的慢查询呢?1.1 索引在数据量不是很大时,大...
2024.11.21背景及需求:项目现有两张表:一张用户表,表名:users;一张用户登录信息表,表名:user_login_log表。需求是:查询用户的基本信息及用户最近一条登录信息的列表数据。数据表结构:users表...
2024.11.21