`

认识mysql的thread_cache及Table_cache

阅读更多

THREAD_CACHE

MySQL里面为了提高客户端请求创建连接过程的性能,提供了一个连接池也就是 Thread_Cache池,将空闲的连接线程放在连接池中,而不是立即销毁.这样的好处就是,当又有一个新的请求的时候,mysql不会立即去创建连接 线程,而是先去Thread_Cache中去查找空闲的连接线程,如果存在则直接使用,不存在才创建新的连接线程.

有关Thread_Cache在MySQL有几个重要的参数,简单介绍如下:

thread_cache_size

Thread_Cache 中存放的最大连接线程数.在短连接的应用中Thread_Cache的功效非常明显,因为在应用中数据库的连接和创建是非常频繁的,如果不使用 Thread_Cache那么消耗的资源是非常可观的!在长连接中虽然带来的改善没有短连接的那么明显,但是好处是显而易见的.但并不是越大越好大了反而 浪费资源这个的确定一般认为和物理内存有一定关系,如下:

1G  —> 8
2G  —> 16
3G  —> 32
>3G  —> 64

如果短连接多的话可以适当加大.

thread_stack

每个连接被创建的时候,mysql分配给它的内存.这个值一般认为默认就可以应用于大部分场景了,除非必要非则不要动它.

thread_handing

运用Thread_Cache处理连接的方式,5.1.19添加的新特性.有两个值可选[no-threads| one-thread-per-connection ]看字面意思大家也该猜出八九分了,呵呵,no-threads 服务器使用一个线程,one-thread-per-connection 服务器为每个客户端请求使用一个线程.原手册中提到,no-threads是在Linux下调试用的.

 

mysql> show variables like 'thread%';
+-------------------+---------------------------+
| Variable_name     | Value                     |
+-------------------+---------------------------+
| thread_cache_size | 32                        |
| thread_handling   | one-thread-per-connection |
| thread_stack      | 196608                    |
+-------------------+---------------------------+
3 rows in set (0.01 sec)

mysql> show status like '%connections%';
+----------------------+--------+
| Variable_name        | Value  |
+----------------------+--------+
| Connections          | 199156 |
| Max_used_connections | 31     |
+----------------------+--------+
2 rows in set (0.00 sec)

mysql> show status like '%thread%';
+------------------------+--------+
| Variable_name          | Value  |
+------------------------+--------+
| Delayed_insert_threads | 0      |
| Slow_launch_threads    | 0      |
| Threads_cached         | 3      |
| Threads_connected      | 6      |
| Threads_created        | 8689 |
| Threads_running        | 5      |
+------------------------+--------+
6 rows in set (0.00 sec)

 

通过以上3个命令,可以看到服务器的thread_cache池中最多可以存放32个连接线程,为每个客户端球使用一个线程.为每个连接的线程分配192k的内存空间.

服务器总共有199156次连接,最大并发连接数为31,当前在thread_cashe池中的连接数为3个,连接数为6个,处于活跃状态的有5个,共创建了8689次连接.显然这里以短连接为主.可以算出thread_cache命中率,公式为:

Thread_Cache_Hit=(Connections-Thread_created)/Connections*100%

当前服务器的Thread_cache命中率约为95.6%这个结果我还是比较满意的.但是可以看出thread_cache_size有点多余改成16或8更合理一些.

 

TABLE_CACHE(5.1.3及以后版本又名TABLE_OPEN_CACHE)

由于MySQL是多线程的机制,为了提高性能,每个线程都是独自打开自己需要的表的文件描述符,而不是通过共享已经打开的.针对不同存储引擎处理的方法当然也不一样.

在myisam表引擎中,数据文件的描述符(descriptor)是不共享的,但是索引文件的描述符却是所有线程共享的.Innodb中和使用表空间类型有关,假如是共享表空间那么实际就一个数据文件,当然占用的数据文件描述符就会比独立表空间少.

个人感觉有点像php里面的fopen打开一个连接,操作完数据之后,并不立即关闭,而是缓存起来,等待下一个连接这个文件的请求就不必去重新打开文件了,不知样理解对不对,哈.

手册上有段关于打开表时的描述:

A MyISAM table is opened for each concurrent access. This means the table needs to be opened twice if two threads access the same table or if a thread accesses the table twice in the same query (for example, by joining the table to itself). Each concurrent open requires an entry in the table cache. The first open of any MyISAM table takes two file descriptors: one for the data file and one for the index file. Each additional use of the table takes only one file descriptor for the data file. The index file descriptor is shared among all threads.

如果你正用HANDLER tbl_name OPEN语句打开一个表,将为该线程专门分配一个表。该表不被其它线程共享,只有线程调用HANDLER tbl_name CLOSE或线程终止后才被关闭。表关闭后,被拉回表缓存中(如果缓存不满)。

mysql手册上给的建议大小是:table_cache=max_connections*n

n表示查询语句中最大表数,还需要为临时表和文件保留一些额外的文件描述符。

这个数据遭到很多质疑,table_cache够用就好,检查Opened_tables值,如果这个值很大,或增长很快那么你就得考虑加大table_cache了.

在下面的条件下,未使用的表将被关闭并从表缓存中移出:

· 当缓存满了并且一个线程试图打开一个不在缓存中的表时。

· 当缓存包含超过table_cache个条目,并且缓存中的表不再被任何线程使用。

· 当表刷新操作发生。当执行FLUSH TABLES语句或执行mysqladmin flush-tablesmysqladmin refresh 命令时会发生。

当表缓存满时,服务器使用下列过程找到一个缓存入口来使用:

· 当前未使用的表被释放,以最近最少使用顺序。

· 如果缓存满了并且没有表可以释放,但是一个新表需要打开,缓存必须临时被扩大。

如果缓存处于一个临时扩大状态并且一个表从在用变为不在用状态,它被关闭并从缓存中释放。

几个关于table_cache的状态值:

1  table_cache:所有线程打开的表的数目。增大该值可以增加mysqld需要的文件描述符的数量。默认值是64.

2  open_tables:当前打开的表的数量.

3  opened_tables :Number of table cache misses,如果opened_tables较大,table_cache 值可能太小.

Open_table_definitions : The number of cached .frm files. This variable was added in MySQL 5.1.3.

Opened_table_definitions : The number of .frm files that have been cached. This variable was added in MySQL 5.1.24.

分享到:
评论

相关推荐

    MySQL thread_cache和table_cache详解

    THREAD_CACHE MySQL里面为了提高客户端请求创建连接过程的性能,提供了一个连接池也就是 Thread_Cache池,将空闲的连接线程放在连接池中,而不是立即销毁.这样的好处就是,当又有一个新的请求的时候,mysql不会立即去创建...

    MySQL性能优化配置参数之thread_cache和table_cache详解

    对于短连接频繁的应用,增大thread_cache_size可以显著提升性能,因为它减少了创建新线程的次数。然而,这个值并非越大越好,过大的设置可能会浪费系统资源。通常建议的设置与物理内存大小有关,例如,1GB内存对应8...

    MySQL性能优化之Open_Table配置参数的合理配置建议

    除此之外,MySQL性能优化还涉及多个其他参数,例如`thread_cache`用于管理线程缓存,`max_connections`定义了最大并发连接数,以及`innodb_buffer_pool_size`等InnoDB存储引擎的缓存大小。这些参数的优化也是提升...

    mysql_best_configuration-master--姜承尧配置5.6-5.7

    2. **thread_cache_size**:线程缓存允许MySQL快速为新连接创建服务线程,减少每次新建线程的开销。根据并发连接数量进行调整,避免过多或过少的线程浪费资源。 3. **max_connections**:设定服务器允许的最大并发...

    mysql提示Changed limits: max_open_files: 2048 max_connections: 1910 table_cache: 64的解决

    MySQL数据库在运行过程中可能会遇到资源限制的问题,这些限制在错误日志中通常表现为"Changed limits: max_open_files: 2048 max_connections: 1910 table_cache: 64"这样的提示。这个提示意味着MySQL服务器在启动时...

    MySQL PXC_百度大神cnf配置

    - `thread_cache_size`: 线程缓存大小,减少线程创建和销毁的开销。 5. **复制设置**: - `binlog_format`: 日志格式,一般推荐`ROW`模式以支持PXC的行级复制。 - `gtid_mode`: 设置全局事务ID模式,对于PXC应...

    RockyLinux9.0 yum安装 mysql8.0

    thread_cache_size = 600 #thread_concurrency = 8 #query_cache_size = 128M #query_cache_limit = 2M #query_cache_min_res_unit = 2k default-storage-engine = MyISAM default-tmp-storage-engine=MYISAM thread...

    MySQL_my.ini 中文详细说明

    thread_cache_size = 8 上述五行代码设置了 MySQL 数据库的各种缓存大小。缓存用于存储经常使用的数据,以提高查询性能。 MySQL_my.ini 文件是 MySQL 数据库的核心配置文件,用于设置数据库的各种参数和设置。通过...

    MySql优化之InnoDB,4GB内存,多查询的my.ini中文配置方案详解

    其次,考虑到多查询执行,我们需要确保有足够的线程缓存(thread_cache_size)来快速响应新的连接请求,减少每次新建线程的开销。对于少量连接,一个适中的值可能是10: ``` thread_cache_size = 10 ``` 接下来是...

    mysql_配置详细说明.docx

    16. **thread_cache_size**:缓存线程的数量,减少创建新线程的开销。 17. **wait_timeout**:定义了非交互连接在无活动后自动断开的时间。 18. **innodb_buffer_pool_size**:InnoDB存储引擎的缓存池大小,对...

    mysql性能调优参数

    2. Thread_cache_size:这个参数确定可以重新利用保存在缓存中线程的数量,默认 8。 3. Table_open_cache:这个参数确定 MySQL 每打开一个表,都会读入一些数据到 table_open_cache 缓存中,默认值 64。 这些参数...

    浅析MySQL内存的使用说明(全局缓存+线程缓存)

    5. `query_cache_size`:查询缓存用于存储SELECT语句及其结果,以避免重复执行相同的查询。然而,如果查询的多样性很高,查询缓存可能反而降低性能。通过观察`Qcache_%`状态值可以评估其效果,并决定是否需要调整或...

    mysql修改最大连接数等优化mysql

    - `thread_cache_size`: 调整为合适的值可以帮助减少创建新线程的开销,但过高的值可能增加内存消耗。 3. **重启MySQL服务** - 修改完配置文件后,需要重启MySQL服务使更改生效。 ```bash /etc/init.d/...

    MySQL配置文件解析

    13. `thread_cache_size`:缓存线程的数量,减少线程创建和销毁的开销。 14. `thread_concurrency`:同一时间处理客户端请求的线程数量,用于控制并发。 15. `query_cache_size`和`query_cache_limit`:定义了查询...

    mysql-8.0.27安装

    thread_cache_size=256 lower_case_table_names=1 innodb_strict_mode=0 # 创建新表时将使用的默认存储引擎 default-storage-engine=INNODB default_authentication_plugin=mysql_native_password innodb_file_per_...

    linux MySQL 8.0二进制包安装

    thread_cache_size = 16 key_buffer_size = 512M table_open_cache = 16384 table_definition_cache = 16384 innodb_lock_wait_timeout = 1500 max_connections=500 初始化数据库,并查看日志: bin/mysqld --...

    linux 高负载下mysql数据库优化

    - 调整连接池大小(`thread_cache_size`),避免频繁创建和销毁线程。 - 使用内存优化的系统变量,如`tmp_table_size`和`max_heap_table_size`,减少临时表在磁盘上的使用。 - 定期优化表,重建索引以消除碎片。 - ...

    mysql安装.docx

    thread_cache_size=768 query_cache_size=0 query_cache_type=0 query_cache_min_res_unit=4K ``` #### 三、注意事项 - 在配置文件中设置的参数可以根据实际需求进行调整,例如最大连接数(`max_connections`)...

    mysql 5.5 配置文档

    14. `thread_cache_size` 和 `thread_concurrency`: 线程缓存大小和并发线程数,调整服务器对并发请求的处理能力。 15. `query_cache_size`, `query_cache_limit` 和 `query_cache_min_res_unit`: 查询缓存的总大小...

Global site tag (gtag.js) - Google Analytics