open/close table on mysql

  • 时间:
  • 浏览:0

所有threads打开表的数量,增加這個 参数时要在mysqld启动的事先增加文件描述符;

里面中含另一个 参数:

在配置文件中,亲们也时要看完open_files_limit参数,而且机会你设置该参数,重启主机后,该参数的值还是以系统的文件描述符为准,而是在安装mysql的事先,在/etc/security/limits.conf配置好mysql用户对最大打开文件数的限制,建议设置到最大:

root@test 10:56:22>set global table_open_cache=2;

+————————–+——-+

| Open_table_definitions   | 4     |

root@test 11:34:19>show global status like ‘open%table%’;

| Open_tables              | 2     |

| Opened_table_definitions | 41    |

第六步:

Table_cache:在MySQL 5.1.3版本中为table_open_cache,其默认值为64,官方文档中对该参数的解释为:

没有在不断的新表打开中,cache被慢慢填满(table_open_cache—-full),机会新打开的表没有在cache中,mysql会将有些没有使用的table清除掉:

root@test 11:33:35>show global status like ‘open%table%’;

从实验上看是满足上述的状况的。

| Open_tables              | 2     |

Mysql在访问一张表的事先,将其放到 到cache中,机会数据库中含有些的表,通常将其放到 到cache中,对性能的提升带来帮助。

The number of open tables for all threads. Increasing this value increases the number of file descriptors thatmysqld requires.

root@test 10:52:22>select * from t1;

+————————–+——-+

+————————–+——-+

| Open_tables              | 2     |

| Opened_tables            | 31    |

| Variable_name            | Value |

session 1:

| Variable_name            | Value |

| Open_table_definitions   | 2     |

| Open_table_definitions   | 2     |

root@test 01:25:00>show global status like ‘open%tables’;

| Open_tables              | 3     |

root@test 11:11:08>show global status like ‘open%table%’;

root@test 11:13:03>show global status like ‘open%table%’;

Open_table_definitions

Session1:

| Opened_tables            | 28    |

Session1:

第五步:

| Open_tables              | 2     |

| Opened_tables | 21393000 |

+—————+———+

| Opened_table_definitions | 31    |

set global table_open_cache=M;

Query OK, 0 rows affected (0.00 sec)

InnoDB has its own per-table cache, variously called a table definition cache or data dictionary, which you cannot configure.When InnoDB opens a table, it adds a corresponding object to the data dictionary. Each table can take up 4 KB or more of memory(although much less space is required in MySQL 5.1). Tables are not removed from the data dictionary when they are closed.

官方文档中告诉亲们时要通过再mysqld_safe启动中加入open-files-limit参数,mysqld_safe –open-files-limit=N,来改变open_files_limit值;

+————————–+——-+

(1)Session 1

第三步:session 4:执行session2的查询,session1中查询open_tables, Open_table_definitions 没有变,保持2;

| Open_table_definitions   | 3     |

| Variable_name            | Value |

| Variable_name            | Value |

| Open_table_definitions   | 3     |

| Opened_table_definitions | 38    |

| Open_table_definitions   | 0     |

第三步:session1

调整文件描述符:open_files_limit和open-files-limit这另一个 参数:

session4:

| Opened_tables            | 300    |

对于InnoDB的存储引擎来说,打开表的法律措施与myisam是不同:

+————————–+——-+

在官方文档中对table_open_cache参数的设置限于对os的文件描述符的上,当然还有些相应内存开销,通常在设置table_open_cache参数的事先,亲们会在业务的高峰时期,检查open_Tables的值,机会open_Tables的值与table_open_cache的值相等,而且opened_tales的值在不断的增加,這個 事先就时要对table_open_cache的值增加了;

(3)Session 4:

| Variable_name | Value   |

Unlike MyISAM Innodb does not have to keep open file descriptor when table is open – open table is purely logical state and appropriate .ibd file may be open or closed,InnoDB uses a single, global file descriptor for each .ibd file.

root@test 11:09:17>show global status like ‘open%table%’;

| Opened_tables            | 43    |

| Variable_name            | Value |

| Variable_name            | Value |

第二步:Session2,3:执行另一个 表的查询,session1中查询open_tables, Open_table_definitions 为2;

+————————–+——-+

那table_open_cache设为有几个值合理,是都不 越大table_open_cache参数设置会带来性能的上的线性提升?当亲们的数据库中上千数量的表的事先,查询中含涉及多样化的多表连接,而且并肩有多个connection连到mysql中执行什么query,没有就机会减慢用完文件描述符cache(table_open_cache),mysql使用LRU算法,把最近相当于使用的描述符关闭掉,用于存放新的描述符。而且在查找要关闭的描述符中,查找时间会随着cache中的缓存数量增加而增加(O(n),n为cache的items数量),文件打开的时间等于文件关闭的时间,从而由于了性能上的下降。

Mysql soft nofiles 65535

第二步:

| Open_tables              | 2     |

Session1:

| Open_table_definitions   | 2     |

+————————–+——-+

+————————–+——-+

Session2:

| Opened_table_definitions | 300    |

| Opened_tables            | 300    |

第另一个 大问题:mysql是何如打开和关闭表的?

在官方文档中描述的很清晰了:

第四步:session5:执行新的查询,session中查询open_tables为2,Open_table_definitions为3;

| Open_tables              | 0     |

root@test 11:10:43>HANDLER t1 open;

session3

第七步:

亲们时要看完,第一步:session1: 现在而是刚开始cache中执行 flush tables后,open_tables为0,Open_table_definitions 为0;

(2)Sessioin 2:

root@test 10:56:03>select * from t2;

table cache:对于不同的存储引擎,table cache的作用是不同的,对于MyISAM表,每另一个 客户端程序池打开任何另一个 MyISAM表的数据文件都时要打开另一个 文件描述符,但机会是索引文件,则时要多个程序池共享同另一个 索引文件的描述符,table cache的主要作用应该用于缓存文件描述符,当有新的请求时不时要重新的打开,使用现在而是刚开始时而是用立即关闭。

root@test 10:56:03>select * from t1;

MySQL is multi-threaded, so there may be many clients issuing queries for a given table simultaneously. To minimize the problem with multiple client sessions having different states on the same table, the table is opened independently by each concurrent session

The number of tables that are open.

session 3:

root@test 11:10:49>select * from t3;

| Opened_tables            | 39    |

| Opened_tables            | 42    |

+————————–+——-+

当亲们在调整table_open_cache的事先,还时要考虑另一个 参数而是os的文件描述符,机会table_open_cache参数设置的很大,mysql有机会用完文件描述符,由于mysql拒绝有些连接请求,这事先就时要根据os的文件描述符限制来设置参数的值。

+—————+———+

+————————–+——-+

| Variable_name            | Value |

知道了里面的知识后,来看下面的参数:

| Opened_table_definitions | 300    |

| Opened_table_definitions | 28    |

+————————–+——-+

第一步:Session1: root@test 11:26:58>flush tables;

| Opened_table_definitions | 40    |

亲们知道mysql是另一个 支持程序池池的数据库,尤其在innodb存储引擎冒出后,对mysql的事务,并发,锁支持得到了极大提高。在高并发的访问的应用场景中,应用端少许并发的程序池池发问数据库,而数据库中的数据表在磁盘上以数据文件存放,在unix,linux的系统调用中,是依赖于文件描述符的。不同的os对文件描述符的限制不同(非Unix/linux 操作系统无文件描述符概念,在windows中称作文件句柄),如在linux中/etc/security/limits.conf配置文件中设置亲们的文件描述符极限。

root@test 10:52:39>select * from test_1;

第四步:

Open_tables

Mysql hard nofiles 65535。

(4)Session5:

Query OK, 0 rows affected (0.00 sec)

+————————–+——-+

| Opened_table_definitions | 42    |

root@test 11:33:41>show global status like ‘open%table%’;

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

第八个大问题:os文件描述符对该参数的限制,

在了解mysql打开表的过程前,时要了解有些知识:

亲们看完在使用HANDLER open打开表的事先,该table不用被mysql清出cache,当cache被填满后,在使用HANDLER open,cache机会被扩展;直到使用handler close关闭后释放。

root@test 11:07:3000>flush tables;

+————————–+——-+

在引擎上,innodb把table cache 叫做了数据字典,表的定义都缓占据 数据字典中(data dictionary),文件描述符上使用另一个 global file descriptor来处理每个ibd文件,机会使用的是共享表空间来存储数据,则打开的文件描述符就比较少,但机会使用的是独享表空间法律措施(innodb_file_per_table=1)则打开的文件描述符则较多。

| Opened_tables            | 41    |

Session5: root@test 11:29:59>HANDLER test_1 open;

+————————–+——-+

+————————–+——-+

root@test 11:34:06>show global status like ‘open%table%’;

root@test 11:10:46>HANDLER t2 open;

| Open_tables              | 0     |

| Open_tables   | 56       |

| Open_table_definitions   | 0     |

| Variable_name            | Value |

+————————–+——-+

机会没有table都可以 被释放,cache机会根据时要临时扩展,当有table关闭机会unused,cache机会被释放:

root@test 11:08:58>show global status like ‘open%table%’;