在MySQL 80 之前, 我们假设一下有一条烂SQL,
mysqlselect from t1 order by rand() ;
以多个线程在跑,导致CPU被跑满了,其他的请求只能被阻塞进不来。那这种情况怎么办?
大概有以下几种解决办法:
设置max_execution_time 来阻止太长的读SQL。那可能存在的问题是会把所有长SQL都给KILL 掉。有些必须要执行很长时间的也会被误杀。
自己写个脚本检测这类语句,比如order by rand(), 超过一定时间用Kill query thread_id 给杀掉。
那能不能不要杀掉而让他正常运行,但是又不影响其他的请求呢?
那mysql 80 引入的资源组(resource group,后面简写微RG)可以基本上解决这类问题。
比如我可以用 RG 来在SQL层面给他限制在特定的一个CPU核上,这样我就不管他,让他继续运行,如果有新的此类语句,让他排队好了。
为什么说基本呢?目前只能绑定CPU资源,其他的暂时不行。
那我来演示下如何使用RG。
创建一个资源组user_ytt 这里解释下各个参数的含义,
type = user 表示这是一个用户态线程,也就是前台的请求线程。如果type=system,表示后台线程,用来限制mysql自己的线程,比如Innodb purge thread,innodb read thread等等。
vcpu 代表cpu的逻辑核数,这里0-1代表前两个核被绑定到这个RG。可以用lscpu,top等列出自己的CPU相关信息。
thread_priority 设置优先级。user 级优先级设置大于0。
mysqlmysql> create resource group user_ytt type = user vcpu = 0-1 thread_priority=19 enable;Query OK, 0 rows affected (003 sec)
RG相关信息可以从 information_schemaresource_groups 系统表里检索。
mysqlmysql> select from information_schemaresource_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 |+---------------------+---------------------+------------------------+----------+-----------------+3 rows in set (000 sec)
我们来给语句select guid from t1 group by left(guid,8) order by rand() 赋予RG user_ytt。
mysql> show processlist;+-----+-----------------+-----------+------+---------+-------+------------------------+-----------------------------------------------------------+| Id | User | Host | db | Command | Time | State | Info |+-----+-----------------+-----------+------+---------+-------+------------------------+-----------------------------------------------------------+| 4 | event_scheduler | localhost | NULL | Daemon | 10179 | Waiting on empty queue | NULL || 240 | root | localhost | ytt | Query | 101 | Creating sort index | select guid from t1 group by left(guid,8) order by rand() || 245 | root | localhost | ytt | Query | 0 | starting | show processlist |+-----+-----------------+-----------+------+---------+-------+------------------------+-----------------------------------------------------------+3 rows in set (000 sec)
找到连接240对应的thread_id。
mysqlmysql> select thread_id from performance_schemathreads where processlist_id = 240;+-----------+| thread_id |+-----------+| 278 |+-----------+1 row in set (000 sec)
给这个线程278赋予RG user_ytt。没报错就算成功了。
mysqlmysql> set resource group user_ytt for 278;Query OK, 0 rows affected (000 sec)
当然这个是在运维层面来做的,我们也可以在开发层面结合 MYSQL HINT 来单独给这个语句赋予RG。比如:
mysqlmysql> select /+ resource_group(user_ytt) /guid from t1 group by left(guid,8) order by rand()8388602 rows in set (4 min 4609 sec)
RG的限制:
Linux 平台上需要开启 CAPSYSNICE 特性。比如我机器上用systemd 给mysql 服务加上
systemctl edit mysql@80 [Service]AmbientCapabilities=CAP_SYS_NICE
mysql 线程池开启后RG失效。
freebsd,solaris 平台thread_priority 失效。
目前只能绑定CPU,不能绑定其他资源。
MySQL服务器的最大并发连接数是16384。
受服务器配置,及网络环境等制约,实际服务器支持的并发连接数会小一些。主要决定因素有:
1、服务器CPU及内存的配置。
2、网络的带宽。互联网连接中上行带宽的影响尤为明显。
扩展资料:
优化数据库结构:
组织数据库的schema、表和字段以降低I/O的开销,将相关项保存在一起,并提前规划,以便随着数据量的增长,性能可以保持较高的水平。
设计数据表应尽量使其占用的空间最小化,表的主键应尽可能短。·对于InnoDB表,主键所在的列在每个辅助索引条目中都是可复制的,因此如果有很多辅助索引,那么一个短的主键可以节省大量空间。
仅创建需要改进查询性能的索引。索引有助于检索,但是会增加插入和更新 *** 作的执行时间。
InnoDB的ChangeBuffering特性:
InnoDB提供了changebuffering的配置,可减少维护辅助索引所需的磁盘I/O。大规模的数据库可能会遇到大量的表 *** 作和大量的I/O,以保证辅助索引保持最新。当相关页面不在缓冲池里面时,InnoDB的changebuffer将会更改缓存到辅助索引条目。
从而避免因不能立即从磁盘读取页面而导致耗时的I/O *** 作。当页面被加载到缓冲池时,缓冲的更改将被合并,更新的页面之后会刷新到磁盘。这样做可提高性能,适用于MySQL55及更高版本。
参考资料来源:百度百科-MySQL数据库
一 基本概念
(一)线程
SQL Server 使用 *** 作系统的线程来执行并发任务 在不使用纤程的情况下 SQL Server将启动线程 并由OS将线程分配给CPU 线程管理由OS内核控制 当一个线程完成退出CPU 其他线程调度占用该CPU时 将发生一个上下文切换 这个切换是在应用程序的用户模式和线程管理的内核模式之间的切换 所以需要付出一定的代价 应当尽量避免这种切换
(二)纤程
为了减少上下文切换 引入纤程的概念 可以在SQL Server中启用纤程 纤程是线程的子模块 纤程由运行在用户模式下的代码管理 所以切换纤程比切换进程的代价少的多 因为纤程模式不需要在将用户模式和内核模式中切换 而切换线程则需要这种转换
(三)两者的区别
SQL Server管理纤程的调度 而OS管理线程的调度;线程模式里 SQL Server为每个并发用户创建配一个线程 而纤程模式中 SQL Server为每个CPU分配一个线程 并为每个并发用户创建配一个纤程 一个线程中可以有多个纤程 纤程只在线程里切换 不用上下文切换
注意 SQL Server Personal Edition和 Desktop Edition不支持纤程模式;Win 不支持线程池
二 SQL Server对线程和纤程的管理
SQL Server既可以为用户连接维护一个线程池 也可以维护一个纤程池(如果设置了纤程模式 则系统只维护纤程池 不在是线程池) 在连接池中 线程和纤程都看作工作纤程 并可以由max worker threads 选项来设置SQL Server可分配的线程或纤程的最大数目 一般采用默认值
当一个语句需要SQL Server执行时
( )如果线程池里用空闲的线程 SQL Server将为该语句分配一个线程
( )如果线程池中没有可供使用的空闲线程并且没有达到最大工作线程数量 SQL Server将为该命令创建新的工作线程
( )如果到了最大线程使用数量并且没有空闲的线程 则进程必须等待其他处理完成后释放一个线程
三 配置SQL Server线程纤程
( )如何启用纤程模式
企业管理器 >服务器属性 >处理器 >使用Windows nt 纤程 或者用 sp_configure 将ligheight pooling 设置为
( )max worker threads 选项
该选项配置SQL Server进程的可用工作线程数 默认值为
改变方法
企业管理器 >服务器属性 >处理器 >最大工作线程或者用 sp_configure修改max worker threads
( )affinity mask 选项
该选项在系统负荷过重时可以提高对称多处理器系统的性能 将线程与特定的处理器相关联 并指定SQL Server使用的处理器
改变方法
企业管理器 >服务器属性 >处理器 >处理器控制 >选择一或多个将亲和力掩码组合在一起的处理器或者用 sp_configure修改affinity mask
( )max degree of paralleli 选项
该选项可以限制在并行计划执行中使用的处理器数量
改变方法
lishixinzhi/Article/program/SQLServer/201311/22308
你的提问就有问题
当你的程序不管是不是多线程的
获得到一个数据库连接是 数据库会把这个连接标记为繁忙 当其他程序访问时它会返回另外空闲的连接
连接个数是有限的 如果一直不释放连接 数据库就会告诉你连接已经使用完了
这里和线程安全有何关系呢? 线程安全和数据库 *** 作没有直接关系
以上就是关于请问mysql数据库是不能多线程写入吗全部的内容,包括:请问mysql数据库是不能多线程写入吗、mysql数据库最大能支持多少并发量、SQL Server数据库的线程与纤程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)