2022
我们一起努力

腾讯云数据库sqlserver(腾讯云数据库TDSQL精英挑战赛)

目录:

  • 1、数据库消耗内存大还是cpu大
  • 2、腾讯云数据库 sqlserver 怎么样
  • 3、腾讯数据库版和腾讯云函数版区别
  • 4、js如何连接和操作腾讯云mysql数据库
  • 5、腾讯云怎么安装数据库,连接数据库
  • 6、腾讯云服务器怎么搭建支持***的mysql数据库

数据库消耗内存大还是cpu大

作者 王文安,腾讯CSIG数据库专项的数据库工程师,主要负责腾讯云数据库 MySQL 的相关的工作,热爱技术,欢迎留言进行交流。文章首发于腾讯云+社区的腾讯云数据库专家服务专栏。

在日常工作中,发现 MySQL 的状态不太对劲的时候,一般都会看看监控指标,很多时候会看到熟悉的一幕:CPU 使用率又爆了。本文将给大家介绍 MySQL 和 CPU 之间的关系,对此有一定的了解之后可以更准确的判断出问题的原因,也能够提前发现一些引发 CPU 问题的隐患。

怎么看懂CPU使用率

以 Linux 的 top 命令为例,效果如下:

Top 命令

在 %CPU 这一列就展示了 CPU 的使用情况,百分比指代的是总体上占用的时间百分比:

%us:表示用户进程的 CPU 使用时间(没有通过 nice 调度)

%sy:表示系统进程的 CPU 使用时间,主要是内核使用。

%ni:表示用户进程中,通过 CPU 调度(nice)过的使用时间。

%id:空闲的 CPU 时间

%wa:CPU 运行时在等待 IO 的时间

%hi:CPU 处理硬中断花费的时间

%si:CPU 处理软中断花费的时间

%st:被虚拟机偷走的 CPU 时间

通常情况下,我们讨论的 CPU 使用率过高,指的是 %us 这个指标,监控里面的 CPU 使用率通常也是这个值(也有用其他的方法计算出来的,不过简单起见,不考虑其他的情况 )。其他几个指标过高也代表出 MySQL 的状态异常,简单起见,这里主要还是指 %us 过高的场景。

MySQL和线程

MySQL 是单进程多线程的结构,意味着独占的 MySQL 服务器里面,只能用 top 命令看到一行数据。

TOP 命令效果

这里能看到的是 MySQL 的进程 ID,如果要看到线程的情况,需要用top -H

TOP 命令效果

在这里能看到的是 MySQL 各个线程的 ID,可以看到 MySQL 在启动之后,会创建非常多的内部线程来工作。

这些内部线程包括 MySQL 自己用来刷脏,读写数据等操作的系统线程,也包括处理用户 SQL 的线程,姑且叫做用户线程吧。用户线程有一个特殊的地方:程序端发送到 MySQL 端的 SQL,只会由一个用户线程来执行(one-thread-per-connection),所以 MySQL 在处理复杂查询的时候,会出现“一核有难,多核围观”的尴尬现象。

参考 %us 的定义,对于 Linux 系统来说,MySQL 进程和它启动的所有线程都不算内核进程,因此 MySQL 的系统线程和用户线程在繁忙的时候,都会体现在 CPU 使用率的 %us 指标上。

什么时候CPU会100%

MySQL 干什么的时候,CPU 会 100%?从前文的分析来看,MySQL 主要是两类线程占用 CPU:系统线程和用户线程。因此 MySQL 独占的服务器上,只需要留意一下这两类线程的情况,就能 Cover 住绝大部分的问题场景。

系统线程

在实际的环境中,系统线程遇到问题的情况会比较少,一般来说,多个系统线程很少会同时跑满,只要服务器的可用核心数大于等于 4 的话,一般也不会遇到 CPU 100%,当然有一些 bug 可能会有影响,比如这个:

MySQL BUG

虽然情况比较少,但是在面对问题的常规排查过程中,系统线程的问题也是需要关注的。

用户线程

提到用户线程繁忙,很多时候肯定会第一时间凭经验想到慢查询。确实 90% 以上的时候都是“慢查询”引起的,不过作为方**,还是要根据分析再去得出结论的~

参考 us% 的定义,是指用户线程占用 CPU 的时间多少,这代表着用户线程占用了大量的时间。

一方面是在进行长时间的计算,例如:order by,group by,临时表,join 等。这一类问题可能是查询效率不高,导致单个 SQL 语句长时间占用 CPU 时间,也有可能是单纯的数据量比较多,导致计算量巨大。另一方面是单纯的 QPS 压力高,所以 CPU 的时间被用满了,比如 4 核的服务器用来支撑 20k 到 30k 的点查询,每个 SQL 占用的 CPU 时间并不多,但是因为整体的 QPS 很高,所以 CPU 的时间被占满了。

问题的定位

分析完之后,就要开始实战了,这里根据前文的分析给出一些经典的 CPU 100% 场景,并给出简要的定位方法作为参考。

PS:系统线程的 bug 的场景 skip,以后有机会再作为详细的案例来分析。

慢查询

在 CPU 100% 这个问题已经发生之后,真实的慢查询和因为 CPU 100% 导致被影响的普通查询会混在一起,难以直观的看 processlist 或者 slowlog 来发现尊敬的大船,这时候就需要一些比较明确的特征来进行甄别。

从前文的简单分析可以看出来,查询效率不高的慢查询通常有以下几种情况:

全表扫描:Handler_read_rnd_next 这个值会大幅度突增,且这一类查询在 slowlog 中 row_examined 的值也会非常高。

索引效率不高,索引选错了:Handler_read_next 这个值会大幅度的突增,不过要注意这种情况也有可能是业务量突增引起的,需要结合 QPS/TPS 一起看。这一类查询在 slowlog 中找起来会比较麻烦,row_examined 的值一般在故障前后会有比较明显的不同,或者是不合理的偏高。

比如数据倾斜的场景,一个小范围的 range 查询在某个特定的范围内 row_examined 非常高,而其他的范围时 row_examined 比较低,那么就可能是这个索引效率不高。

排序比较多:order by,group by 这一类查询通常不太好从 Handler 的指标直接判断,如果没有索引或者索引不好,导致排序操作没有消除的话,那么在 processlist 和 slowlog 通常能看到这一类查询语句出现的比较多。

当然,不想详细的分析 MySQL 指标或者是情况比较紧急的话,可以直接在 slowlog 里面用 rows_sent 和 row_examined 做个简单的除法,比如 row_examined/rows_sent 1000 的都可以拿出来作为“嫌疑人”处理。这类问题一般在索引方面做好优化就能解决。

PS:1000 只是个经验值,具体要根据实际业务情况来定。

计算量大

这一类问题通常是因为数据量比较大,即使索引没什么问题,执行计划也 OK,也会导致 CPU 100%,而且结合 MySQL one-thread-per-connection 的特性,并不需要太多的并发就能把 CPU 使用率跑满。这一类查询其实是是比较好查的,因为执行时间一般会比较久,在 processlist 里面就会非常显眼,反而是 slowlog 里面可能找不到,因为没有执行完的语句是不会记录的。

这一类问题一般来说有三种比较常规的解决方案:

读写分离,把这一类查询放到平时业务不怎么用的只读从库去。

在程序段拆分 SQL,把单个大查询拆分成多个小查询。

使用 HBASE,Spark 等 OLAP 的方案来支持。

高 QPS

这一类问题单纯的就是硬件资源的瓶颈,不论是 row_examined/rows_sent 的比值,还是 SQL 的索引、执行计划,或者是 SQL 的计算量都不会有什么明显问题,只是 QPS 指标会比较高,而且 processlist 里面可能什么内容都看不到,例如:

processlist

总结

实际上 CPU 100% 的问题其实不仅仅是单纯的 %us,还会有 %io,%sys 等,这些会涉及到 MySQL 与 Linux 相关联的一部分内容,展开来就会比较多了。本文仅从 %us 出发尝试梳理一下排查定位的思路和方法,在分析 %io,%sys 等方面的问题时,也可以用类似的思路,从这些指标的意义开始,结合 MySQL 的一些特性或者特点,逐步理清楚表象背后的原因。

腾讯云数据库 sqlserver 怎么样

1. 默认采用Dynamic行格式。

2. QPS:每秒处理查询数。

3. 并发数:同一时间实例处理的并发请求数。

4. 测试工作集:测试数据规模,即访问数据的分布规模。

6. 测试中,每条事务包含4条点查询语句,以及1条更新语句,测试采用Special分布,Special数据占1%,有关详情请参考SysBench手册。

7. 测试中,默认使用prepare模式,即:--db-ps-mode=auto。

腾讯数据库版和腾讯云函数版区别

前者为提供云数据库的服务平台,后者为免费运行代码的计算平台。

腾讯云数据库(TencentDB)是腾讯提供的高可靠、高可用、可弹性伸缩的云数据库服务产品的总称。可轻松运维主流开源及商业数据库(MySQL、Redis、MongoDB、MariaDB、SQL Server、PostgreSQL等),它更拥有容灾、备份、恢复、监控、数据传输服务、安全服务、灾备和智能 DBA 等全套服务。

云函数(Serverless Cloud Function,SCF)是腾讯云为企业和开发者们提供的无服务器执行环境,帮助您在无需购买和管理服务器的情况下运行代码。您只需使用平台支持的语言编写核心代码并设置代码运行的条件,即可在腾讯云基础设施上弹性、安全地运行代码。云函数是实时文件处理和数据处理等场景下理想的计算平台。

如果是海量数据存储,可以考虑市面上的对象存储,比如杉岩海量对象存储MOS,为解决海量非结构数据存储提供整体解决方案。

js如何连接和操作腾讯云mysql数据库

首先是登陆腾讯云,登陆之后可以领取新手礼包,如图

进入云产品-数据库-CDB for MYSQL-立即选购,选购最低配的可用礼包抵扣使用一个月,购买完成

主页-右上角产品管理-使用中的数据库,这时我们会看见一个实例,首先我们进入管理页面对实例进行一些基本的设置

实例名可以随意更改,外网地址必须开启,否则我们就不能在自己的项目中和本地访问云数据库。进入账号管理页面修改自己的root密码,然后点击右上角的登录数据库

登陆完成之后如下图

这个和本地客户端操作基本相同,我就不详细阐述了

   二、使用一个demo来说明如何操作云mysql数据库

1.在实例上上新建一个为nodejs的数据库,然后新建一个为employee的表,新建四个字段 name  sex   age   email除了年龄为int其它的全部为varchar格式

2.新建一个TimLiu的文件夹,打开cmd,cd TimLiu, 初始化项目npm init ,按照它的提示一步一步的操作即可,安装mysql模块,npm insitall mysql, 这个模块的作用主要是连接mysql数据库。

3.新建一个model.js 文件,

   var mysql = require(‘mysql’);

   var connection = mysql.createConnection({

           host:'',

           user:'root',

           password:'123abc',

           database:' nodejs',

           port:6445

          })

connection.connect();

这里的host为我们在腾讯云上开通的外地址,端口号也是在外网地址里面,注意要把外网地址写分开,用户为默认的管理员用户,密码为我们在云平台上设置的密码,数据库为我们创建的nodejs数据库。

接下来我们对数据库进行增删改查操作

/**

* 增加员工

*/function addEmployee(){

   var employeeInsertSql = 'INSERT INTO employee(name,sex,age,email) VALUES(?,?,?,?)';

   var employeeInsertSql_Params = ['Tim','男',22,'18818216454@163.com']

   connection.query(employeeInsertSql,employeeInsertSql_Params,function(err,result){

       if(err) console.log('[INSERT ERR]-',err.message);

       console.log(result);

   }) }addEmployee()

 }

/**

* 更新员工

*/

function insertEmployee(){

   var employeeUpdateSql = "UPDATE employee SET name = ? WHERE age =?";

   var employeeUpdateSql_Params = ['Peter',22];

   connection.query(employeeUpdateSql,employeeUpdateSql_Params,function(err,result){

       if(err) console.log('[UPDATE ERR]-',err.message);

       console.log(result);

   })}

insertEmployee();

/**

*查询员工

*/  function getEmployee(){

   var employeeGetSql = "SELECT * FROM employee";

   connection.query(employeeGetSql,function(err,result){

       if(err) console.log('[SELECT ERR]-',err.message);

       console.log(result);

   })}

getEmployee();

/**

*删除员工

*/  function deleteEmployee(){

   var employeeDeleteSql = "DELETE employee WHERE name = ?";

   var employeeDeleteSql_Params = 'Peter';

   connection.query(employeeDeleteSql,employeeDeleteSql_Params,function(err,result){

       if(err) console.log('[DELETE ERR]-',err.message);

       console.log(result);

   })

   }deleteEmployee();

这样我们就可以愉快的操作数据库了

如果大家想把项目更模块化操作,可在model下面新建一个employee_two.js,代码如下

var mysql = require('mysql');var connection = mysql.createConnection({

   host:'',

   user:'root',

   password:'',

   database:'nodejs',

   port:})connection.connect();/**

* 增加员工

* @param {String} employee

* @param {Function} callback

*/exports.addEmployee=function(employee,callback){

   var employeeInsertSql = 'INSERT INTO employee(name,sex,age,email) VALUES(?,?,?,?)';

   var employeeInsertSql_Params = [employee.name,employee.sex,employee.age,employee.email]

   connection.query(employeeInsertSql,employeeInsertSql_Params,callback)}/**

* 更新员工

* @param {String} employee

* @param {Function} callback

*/exports.updateEmployee = function(name,age){

   var employeeUpdateSql = "UPDATE employee SET name = ? WHERE age =?";

   var employeeUpdateSql_Params = ['Peter',22];

   connection.query(employeeUpdateSql,employeeUpdateSql_Params,function(err,result){

       if(err) console.log('[UPDATE ERR]-',err.message);

       console.log(result);

   })}/**

* 查询员工

*

*/exports.getEmployee = function(){

   var employeeGetSql = "SELECT * FROM employee";

   connection.query(employeeGetSql,callback)}/**

* 删除员工

* @param {String} name

*/exports.deleteEmployee = function(name){

   var employeeDeleteSql = "DELETE employee WHERE name = ?";

   var employeeDeleteSql_Params = 'Peter';

   connection.query(employeeDeleteSql,employeeDeleteSql_Params,callback)

   }再在根目录下新建index.js,代码如下var db = require('./model/employee_two');//增加员工var employee = {

   name:'lisa',

   age:22,

   sex:"女",

   email:'99533212@qq.com'}db.addEmployee(employee,function(err,result){

   if(err) console.log("[INSERT err]-",err.message)

   console.log(result);})//删除员工db.deleteEmployee('Peter',function(err,result){

   if(err) console.log("[DELETE err]-",err.message)

   console.log(result);})//更新员工db.updateEmployee('Tim',23,function(err,result){

   if(err) console.log("[UPDATE err]-",err.message)

   console.log(result);})//查询员工db.getEmployee(function(err,result){

   if(err) console.log("[GET err]-",err.message)

   console.log(result);})

腾讯云怎么安装数据库,连接数据库

你说的是在腾讯云服务器上安装数据库吗?直接在本地数据库的数据服务里面输入云服务器的ip地址;然后想登录本地数据库一样进行登录;只要能够联网,什么地方都能进行连接

腾讯云服务器怎么搭建支持***的mysql数据库

使用第三方一键php包的配置。win服务器还是linux 服务器都可以在三方面板中成功配置出可视化操作界面,然后一键部署php环境。

接下去就是这些步骤了:

1、注册域名

2、选购服务器

3、网站备案

4、搭建网站环境

5、安装网站程序

6、充实网站内容

数据库操作就是这么来的。因为这方面内容较多,留言或到博客找相关内容,老魏写过不少详细的内容,可以帮助入门。

赞(0)
文章名称:《腾讯云数据库sqlserver(腾讯云数据库TDSQL精英挑战赛)》
文章链接:https://www.fzvps.com/180019.html
本站文章来源于互联网,如有侵权,请联系管理删除,本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。
图片版权归属各自创作者所有,图片水印出于防止被无耻之徒盗取劳动成果的目的。

评论 抢沙发

评论前必须登录!