为什么mysql比DB中的表有更多的开放和碎片表?

我一直在努力使我们的数据库运行一点点,并在过去一周取得了良好的效果。 但是还有一些我不明白的东西。

首先,数据库有25个表。 但mysql状态显示512是打开的:mysqladmin状态正常运行时间:212854线程:1问题:43041慢查询:7打开:2605刷新表:1打开表格:512查询每秒平均:0.202

我读过isam打开额外的文件描述符和其他几个原因,为什么打开的表的数量可能会高于25,但我猜测512是不是一件好事。 任何build议,为什么这可能是或我应该看看?

我也一直在使用mysqltuner,它是有帮助的。 但是它一直在207处列出碎片表的数量。在phpmyadmin中,我select了所有的表格并优化了几次。 它没有减lessmysqltuner报告的碎片表的数量。

我想我错过了关于这一切如何工作的一些重要概念。 有没有人有任何build议,指向我在正确的方向或缩小谷歌search或只是一般来说帮助我不那么笨?

谢谢!

 --------一般统计---------------------------------------- ----------
 [ - ]跳过版本检查MySQLTuner脚本
 [确定]当前运行支持的MySQL版本5.5.20-log
 [确定]在64位体系结构上运行

 --------存储引擎统计--------------------------------------- ----
 [ - ]状态:+归档-BDB -Federated + InnoDB -ISAM -NDBCluster
 [ - ] MyISAM表中的数据:1M(表:254)
 [ - ] InnoDB表中的数据:3M(表格:199)
 [ - ] PERFORMANCE_SCHEMA表中的数据:0B(表:17)
 [!!]碎片表总数:200

 --------安全build议---------------------------------------- ---
 [确定]所有数据库用户都分配了密码

 -  -  -  -  性能指标  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - ---------
 [ - ]上升:3d 12h 5m 8s(142K q [0.472 qps],11K conn,TX:105M,RX:37M)
 [ - ]读/写:79%/ 21%
 [ - ]总缓冲区:全球202.0M +每个线程2.5M(最多100个线程)
 [OK]最大可能的内存使用量:452.0M(已安装RAM的48%)
 [确定]慢查询:0%(8 / 142K)
 [OK]可用连接的最高使用率:9%(9/100)
 [确定]键缓冲区大小/总MyISAM索引:16.0M / 741.0K
 [OK]键caching命中率:99.9%(404Kcaching/ 513条读取)
 [确定]查询caching效率:72.1%(caching61K / 84Kselect)
 [确定]每天查询caching修剪:0
 [确定]需要临时表的sorting:0%(0温度sorting/ 1Ksorting)
 [!!]磁盘上创build的临时表:41%(磁盘上6K /总共14K)
 [确定]线程caching命中率:99%(9创build/ 11K连接)
 [!!]表caching命中率:15%(512打开/ 3K打开)
 [确定]使用打开的文件限制:55%(633 / 1K)
 [确定]立即获得表锁:100%(40K立即/ 40K锁)
 [!!]连接中止:7%
 [确定] InnoDB数据大小/缓冲池:3.3M / 16.0M

 --------build议----------------------------------------- ------------
一般build议:
    运行OPTIMIZE TABLE进行碎片整理以获得更好的性能
    进行调整时,使tmp_table_size / max_heap_table_size相等
    减less不带LIMIT子句的SELECT DISTINCT查询
    逐渐增加table_cache以避免文件描述符限制
    您的应用程序没有正确closuresMySQL连接
variables调整:
     tmp_table_size(> 128M)
     max_heap_table_size(> 128M)
     table_cache(> 512)

这可能与table_cache和/或max_connections

使用MyISAM表,每个新的线程/连接都需要打开表。 换句话说,如果你有一个表和十个客户端访问该表,那么根据MySQL状态行,你有十个打开的表。 table_cache通过保持表的线程打开来帮助减less这个常量的开/关表工作。

你的表caching似乎工作得很好,因为已经有43 041个查询,但实际上只需要打开2605个表。

InnoDB有自己的连接池,行为有点不同。

有关更多信息,请参见MySQL如何打开和closures表 。