gacvd 发表于 2018-10-7 11:56:26

MYSQL 最大连接数设置

Open tables:110,即当前数据库打开表的数量是110个,注意这个100并不是实际的110个表,因为MySQL是多线程的系统,几个不同的并发连接可能打开同一个表,这就需要为不同的连接session分配独立的内存空间来存储这些信息以避免冲突。因此连接数的增加会导致MySQL需要的文件描述符数目的增加。另外对于MyISAM表,还会建立一个共享的索引文件描述符。  

  
    在MySQL数据库层面,有几个系统参数决定了可同时打开的表的数量和要使用的文件描述符,那就是table_open_cache、max_tmp_tables和open_files_limit。
  

  
mysql> show variables like 'table_open%';
  
+------------------+-------+
  
| Variable_name    | Value |
  
+------------------+-------+
  
| table_open_cache | 256   |
  
+------------------+-------+
  
1 row in set (0.00 sec)
  

  
    table_open_cache:256,这就是说所有的MySQL线程一共能同时打开256个表,我们可以搜集系统的打开表的数量的历史记录和这个参数来对比,决定是否要增加这个参数的大小。查看当前的打开表的数目(Open tables)可用上边提到过的status命令,另外可以直接查询这个系统变量的值:
  

  
mysql> show status like 'open_tables';
  
+---------------+-------+
  
| Variable_name | Value |
  
+---------------+-------+
  
| Open_tables   | 3   |
  
+---------------+-------+
  
1 row in set (0.00 sec)
  

  
    Open_tables就是当前打开表的数目,通过flush tables命令可以关闭当前打开的表。 这个值如果过大,并且如果没有经常的执行flush tables命令,可以考虑增加table_open_cache参数的大小。
  

  
接下来看max_tmp_tables:
  
mysql> show variables like 'max_tmp%';
  
+----------------+-------+
  
| Variable_name| Value |
  
+----------------+-------+
  
| max_tmp_tables | 32    |
  
+----------------+-------+
  
1 row in set (0.00 sec)
  
max_tmp_tables:32即单个客户端连接能打开的临时表数目。查看当前已    打开的临时表的信息:
  
mysql> show global status like '%tmp%table%';
  
+-------------------------+-------+
  
| Variable_name         | Value |
  
+-------------------------+-------+
  
| Created_tmp_disk_tables | 0   |
  
| Created_tmp_tables      | 11    |
  
+-------------------------+-------+
  
2 rows in set (0.00 sec)
  
    根据这两个值可以判断临时表的创建位置,一般选取BLOB和TEXT列、Group by 和 Distinct语句的数据量超过512 bytes,或者union的时候select某列的数据超过512 bytes的时候,就直接在磁盘上创建临时表了,另外内存中的临时表变大的时候,也可能被MySQL自动转移到磁盘上(由tmp_table_size和max_heap_table_size参数决定)。
  

  
    增加table_open_cache或max_tmp_tables 参数的大小后,从操作系统的角度看,mysqld进程需要使用的文件描述符的个数就要相应的增加,这个是由open_files_limit参数控制的。
  
mysql> show variables like 'open_files%';
  
+------------------+-------+
  
| Variable_name    | Value |
  
+------------------+-------+
  
| open_files_limit | 2670|
  
+------------------+-------+
  
1 row in set (0.00 sec)
  
    但是这个参数是OS限制的,所以我们设定的值并不一定总是生效。如果OS限制MySQL不能修改这个值,那么置为0。如果是专用的MySQL服务器上,这个值一般要设置的尽量大,就是设为没有报Too many open files错误的最大值,这样就能一劳永逸了。当操作系统无法分配足够的文件描述符的时候,mysqld进程会在错误日志里记录警告信息。
  
相应的,有两个状态变量记录了当前和历史的文件打开信息:
  
mysql> show global status like '%open%file%';
  
+---------------+-------+
  
| Variable_name | Value |
  
+---------------+-------+
  
| Open_files    | 0   |
  
| Opened_files| 76    |
  
+---------------+-------+
  
2 rows in set (0.00 sec)
  
MySQL为每个连接分配线程来处理,可以通过threads_connected参数查看当前分配的线程数量:
  
mysql> show status like '%thread%';
  
+------------------------------------------+-------+
  
| Variable_name                            | Value |
  
+------------------------------------------+-------+
  
| Delayed_insert_threads                   | 0   |
  
| Performance_schema_thread_classes_lost   | 0   |
  
| Performance_schema_thread_instances_lost | 0   |
  
| Slow_launch_threads                      | 0   |
  
| Threads_cached                           | 0   |
  
| Threads_connected                        | 1   |
  
| Threads_created                        | 1   |
  
| Threads_running                        | 1   |
  
+------------------------------------------+-------+
  
8 rows in set (0.00 sec)
  
    比较threads_connected参数和前面提到的max_connections参数,也可以作为目前的系统负载的参照,决定是否需要修改连接数。
  

  
    查看每个线程的详细信息:mysql>show processlist;对影响系统运行的线程:kill connection|query threadid的命令杀死。


页: [1]
查看完整版本: MYSQL 最大连接数设置