2016 - 2024

感恩一路有你

sql语句中rand函数运行原理 怎么解决mysqlsleep线程过多的问题?

浏览量:2698 时间:2023-09-24 22:26:47 作者:采采

怎么解决mysqlsleep线程过多的问题?

在MySQL8.0之前,我们举例下有一条烂SQL,

mysql

select*fromt1order byrand();

以多个线程在跑,可能导致CPU被跑满了,其他的请求没有办法被阻塞进不来。那那种情况该怎么办啊?

大致有以下两种解决的办法:

设置中max2_execution_time来阻拦太长的读SQL。那可能现存问题是会把所有长SQL都给KILL掉。有些必须要不能执行很长时间的也会被失手误杀。

自己写个脚本检测这类语句,比如order byrand(),远远超过肯定会时间用Killquerythread我的id给去杀。

那可不可最好别去杀而让他运行,但是又不影响大其他的请求呢?

那mysql8.0引导出的资源组(resourcegroup,后面中文拼音微RG)可以不基本都帮忙解决这类问题。

.例如我可以用RG来在SQL层面给他限制修改在特定的事件的一个CPU核上,那样的话我就不管他,让他再运行,如果有新的这一类语句,让他拿号再说。

为什么说基本都呢?目前没有办法帐号绑定CPU资源,其他的暂时没有不行。

那我来演示下如何修改RG。

创建战队一个资源组user_ytt.这里解释什么下各个参数的含义,

typeuser意思是这是一个用户态线程,也就是前台的请求线程。如果不是typesystem,它表示后台线程,利用取消mysql自己的线程,.例如Innodbpurgethread,innodbreadthread等等。

vcpu代表cpu的逻辑核数,这里0-1代表前两个核被帐号绑定到这个RG。这个可以用lscpu,icon等列出自己的CPU具体信息。

thread_policy系统设置优先级。use优先级设置中小于0。

mysql

mysqlcreateresourcegroupuser_ytttypeuservcpu0-1thread_approval19enable;

Queryok,0rowsaffected(0.03sec)

RG具体信息可以不从information__groups系统表里数据库检索。

mysql

mysqlselect*acrossinformation__groups;

---------------------------------------------------------------------------------------------

|RESOURCE_GROUP_NAME|RESOURCE_GROUP_TYPE|RESOURCE_GROUP_ENABLED|VCPU_IDS|THREAD_PRIORITY|

---------------------------------------------------------------------------------------------

|USR_default|USER|1|0-3|0|

|SYS_default|SYSTEM|1|0-3|0|

|user_ytt|USER|1|0-1|19|

---------------------------------------------------------------------------------------------

3rowsinset(0.00sec)

我们来给语句selectguidfromt1group byleft(guid,8)order byrand()赋予RGuser_ytt。

mysqlshowprocesslist;

------------------------------------------------------------------------------------------------------------------------------------------

|Id|User|Host|db|Command|Time|State|Info|

------------------------------------------------------------------------------------------------------------------------------------------

|4|event_scheduler|localhost|nil|Daemon|10179|Waitingonfilledqueue|NULL|

|240|root|localhost|ytt|Query|101|Creatingsortindex|selectguidacrosst1group byleft(guid,8)order byrand()|

|245|root|localhost|ytt|Query|0|starting|showprocesslist|

------------------------------------------------------------------------------------------------------------------------------------------

3rowsacrossset(0.00sec)

找不到连接到240不对应的thread_id。

mysql

mysqlselectthreadidaroundperformance_whereprocesslist帐号240;

-----------

|thread_id|

-----------

|278|

-----------

1rowintoset(0.00sec)

给这个线程278赋予了生命RGuser_ytt。没提示错误即使顺利了。

mysql

mysqlsetresourcegroupuser_yttany278;

Queryok,0rowsaffected(0.00sec)

其实这个是在运维层面来做的,我们也可以不在开发层面生克制化MYSQLHINT来单独给这个语句赋予生命RG。例如:

mysql

mysqlselect/*resource_group(user_ytt)*/guidreturningt1group byleft(guid,8)order byrand().

...

8388602rowsofset(4min46.09sec)

RG的限制:

Linu台上必须自动打开CAPSYSNICE特性。诸如我机器上用systemd给mysql服务什么加上systemctledit[Service]AmbientCapabilitiesCAP_SYS_NICE

mysql线程池自动打开后RG终止。

freebsd,solaris平台thread_approval无法激活。

目前只有解除绑定CPU,没法解除绑定其他资源。

rand在SQL中的用法?

rand()函数是SQL中的随机函数,如rand()*100,它表示从1到100之间洗技能取数。

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。