`
hlidc
  • 浏览: 28859 次
  • 性别: Icon_minigender_2
  • 来自: 南京
文章分类
社区版块
存档分类
最新评论

MySQL数据库线程缓冲池详解

 
阅读更多
MySQL数据库线程缓冲池的相关知识是本文我们主要要介绍的内容,MySQL数据库支持线程缓存,在多线程连接模式下,如果连接断开后,将这个线程放入空闲线程缓冲区,在下次有连接到来时,先去缓冲池中查找是否有空闲线程,有则用之,无则创建。启动时可以设置线程缓冲池的数目:Mysqld.exe --thread_cache_size=10。

  在一个连接断开时,会调用cache_thread函数,将空闲的线程加入到cache中,以备后用。源码如下:

  static bool cache_thread() { safe_mutex_assert_owner(&LOCK_thread_count); if ( cached_thread_count < thread_cache_size && ! abort_loop && !kill_cached_threads) { /* Don't kill the thread, just put it in cache for reuse */ DBUG_PRINT("info", ("Adding thread to cache")); cached_thread_count++; while (!abort_loop && ! wake_thread && ! kill_cached_threads) (void) pthread_cond_wait(&COND_thread_cache, &LOCK_thread_count); cached_thread_count--; if (kill_cached_threads) pthread_cond_signal(&COND_flush_thread_cache); if (wake_thread) { THD *thd; wake_thread--; thd= thread_cache.get(); thd->thread_stack= (char*) &thd; // For store_globals (void) thd->store_globals(); /* THD::mysys_var::abort is associated with physical thread rather than with THD object. So we need to reset this flag before using this thread for handling of new THD object/connection. */ thd->mysys_var->abort= 0; thd->thr_create_utime= my_micro_time(); threads.append(thd); return(1); } } return(0); }

  上面我们的启动参数设置线程缓冲区为10,此时对应代码里面的thread_cache_size = 10,cached_thread_count记录

  了此刻cache中的空闲线程数目,只有在cache未满的情况下,才会将新的空闲线程加入缓冲池中。加入到缓冲区其实就是将线

  程挂起,pthread_cond_wait函数便是线程等待函数,在此函数中,会调用WaitForMultipleObjects进行事件等待。具体源码

  如下:

  int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, struct timespec *abstime) int result; long timeout; union ft64 now; if( abstime != NULL ) { GetSystemTimeAsFileTime(&now.ft); /* Calculate time left to abstime - subtract start time from current time(values are in 100ns units) - convert to millisec by dividing with 10000 */ timeout= (long)((abstime->tv.i64 - now.i64) / 10000); /* Don't allow the timeout to be negative */ if (timeout < 0) timeout= 0L; /* Make sure the calucated timeout does not exceed original timeout value which could cause "wait for ever" if system time changes */ if (timeout > abstime->max_timeout_msec) timeout= abstime->max_timeout_msec; } else { /* No time specified; don't expire */ timeout= INFINITE; } /* Block access if previous broadcast hasn't finished. This is just for safety and should normally not affect the total time spent in this function. */ WaitForSingleObject(cond->broadcast_block_event, INFINITE); EnterCriticalSection(&cond->lock_waiting); cond->waiting++; LeaveCriticalSection(&cond->lock_waiting); LeaveCriticalSection(mutex); result= WaitForMultipleObjects(2, cond->events, FALSE, timeout); EnterCriticalSection(&cond->lock_waiting); cond->waiting--; if (cond->waiting == 0) { /* We're the last waiter to be notified or to stop waiting, so reset the manual event. */ /* Close broadcast gate */ ResetEvent(cond->events[BROADCAST]); /* Open block gate */ SetEvent(cond->broadcast_block_event); } LeaveCriticalSection(&cond->lock_waiting); EnterCriticalSection(mutex); return result == WAIT_TIMEOUT ? ETIMEDOUT : 0; }

  此处是等待时间,何处进行事件通知呢?我们再次来到上篇所提及的为新的连接创建线程的代码中:

  void create_thread_to_handle_connection(THD *thd) { if (cached_thread_count > wake_thread) { /* Get thread from cache */ thread_cache.append(thd); wake_thread++; pthread_cond_signal(&COND_thread_cache); } Else ... }

  关于MySQL数据库线程缓冲池的相关知识就介绍到这里了O(∩_∩)O~

温情提示:有服务器的问题及服务器租用、托管需求的朋友联系www.163ns.com QQ:6041800 联系人:小郑
分享到:
评论

相关推荐

    MySQL数据库性能监控与诊断

    ### MySQL数据库性能监控与诊断详解 在IT领域,特别是对于依赖于数据库的现代应用程序而言,数据库性能监控与诊断是确保系统稳定性和响应速度的关键环节。本文将深入探讨MySQL数据库性能监控与诊断的相关知识点,...

    2G内存的MYSQL数据库服务器优化

    ### 2G内存的MySQL数据库服务器优化 在IT行业中,对于资源有限的环境进行数据库优化是一项挑战性工作,尤其是在仅有2GB内存的情况下对MySQL数据库服务器进行优化。这种优化旨在提高性能的同时确保系统的稳定运行。 ...

    mysql数据库配置模板

    ### MySQL数据库配置模板详解 #### 一、概述 在MySQL的日常管理与维护工作中,合理的配置文件设置对于提升系统性能及稳定性至关重要。本篇将基于提供的`my.cnf`配置文件模板,对其中的关键参数进行深入解读,并...

    mysql 5.7 配置详解

    - `innodb_buffer_pool_size`: InnoDB存储引擎的缓冲池大小,用于缓存表数据和索引,提高性能。 - `max_connections`: 允许的最大并发连接数,过多连接可能导致资源耗尽。 - `thread_cache_size`: 线程缓存大小,...

    MySQL安装及配置步骤详解

    1. 配置缓冲池:在 my.ini(Windows)或 my.cnf(Linux)文件中,找到[mysqld]段,根据服务器内存的大小,调整以下参数: ``` [mysqld] innodb_buffer_pool_size=64M ``` 2. 配置线程数:在 my.ini(Windows)或 my....

    MySql体系结构中文详解 运维必备

    MySQL是一种广泛使用的开源关系型数据库管理系统,其高效、稳定、易用的特点使其在Web应用程序中占据了重要的地位。MySQL的体系结构是理解其工作原理和优化性能的关键,对于MySQL DBA(数据库管理员)来说,深入理解...

    mysql数据库优化

    ### MySQL 数据库优化详解 #### 一、MySQL优化概述 MySQL作为一款广泛使用的开源关系型数据库管理系统,在实际应用中,其性能表现对于整个系统的稳定性和响应速度至关重要。MySQL的优化可以分为多个方面,包括硬件...

    MySQL-5.5新特性详解及参数优化

    MySQL是一款流行的开源关系型数据库管理系统,它由瑞典的MySQL AB公司开发,目前属于Oracle公司。MySQL以其高性能、低成本、高可靠性和灵活性,广泛应用于中小型网站和大型互联网企业。随着技术的发展,MySQL也在...

    叶金荣_MySQL压力测试经验

    - **MySQL配置**:例如事务隔离级别、缓冲池大小、并发线程数、重做日志、binlog同步方式、`innodb_flush_log_at_trx_commit`等。 #### 五、常见的注意事项 在进行压力测试过程中,需要注意以下几点: - **仅在本地...

    linux mysql5.7.13 配置以及配置文件

    - `innodb_buffer_pool_size`:InnoDB 存储引擎的缓冲池大小,影响数据库处理大量数据的能力。 - `max_connections`:允许的最大并发连接数,根据服务器资源适当设置。 - `query_cache_size`:查询缓存大小,但 ...

    mysql5.5版本和配置文件的详细说明

    5. **innodb_buffer_pool_size**: InnoDB存储引擎的缓冲池大小,用于缓存InnoDB表的数据和索引,提高性能。 6. **max_connections**: 允许的最大并发连接数,需根据服务器资源和应用需求进行设定。 7. **log-bin**: ...

    Mysql培训课件

    - 支持多缓冲池实例。 - 在Linux系统中支持固有的异步输入输出功能。 以上知识点涵盖了MySQL的基本概念、特点优势、不同版本的区别以及各版本的新功能介绍等内容,旨在帮助学习者全面了解MySQL,并掌握其核心功能...

    MySQL-5.7新增功能全揭秘中文版

    - **新特性简介**:MySQL 5.7 允许 DBA 在线调整 InnoDB 缓冲池的大小,这极大地方便了生产环境中的维护工作。 - **功能详情**:通过设置 `innodb_buffer_pool_size` 参数,可以在不重启服务的情况下动态调整缓冲池...

    MySQL在面试中经常被问到.docx MySQL是一个流行的关系型数据库管理系统(RDBMS),在面试中经常被问

    - 调整MySQL配置参数,如调整缓冲池大小、线程数等以适应不同的应用需求。 - **效果**:通过上述手段,可以显著提高MySQL处理数据的速度和效率。 #### 可扩展性 - **概念**:MySQL支持通过水平扩展(如主从复制、...

    Oracle与MySQL DBA面试大全

    - **MySQL调优**:调优MySQL一般涉及到修改配置文件,例如`***f`或`my.ini`,包括设置缓冲池大小、最大连接数、查询缓存、线程缓存、InnoDB的表空间和日志文件大小等。 - **读写分离与主从复制**:MySQL支持读写分离...

    MySQL体系结构深入解析

    4. **InnoDB Buffer Pool**:InnoDB存储引擎特有的缓冲池,用于缓存数据和索引页面。 5. **其他缓存**:还包括诸如临时表缓存、二进制日志缓存等。 #### 三、MySQL进程结构详解 MySQL主要通过多线程而非多进程的...

Global site tag (gtag.js) - Google Analytics