Mysql 对信息\u schema.tables的慢速查询

Mysql 对信息\u schema.tables的慢速查询,mysql,performance,Mysql,Performance,我在一个典型的共享托管服务上运行了一组自行开发的应用程序。我从允许表的静态配置表列表移动到基于D/B元数据前缀的表列表。当我将此版本推广到公共服务时,我的每请求延迟平均增加了2.3–2.4秒。一些检测显示,这完全取决于一个SQL查询: SELECT TABLE_NAME AS name FROM information_schema.tables WHERE TABLE_SCHEMA = '<DBname>' AND TABLE_NAME LIKE '<TablePrefix&

我在一个典型的共享托管服务上运行了一组自行开发的应用程序。我从允许表的静态配置表列表移动到基于D/B元数据前缀的表列表。当我将此版本推广到公共服务时,我的每请求延迟平均增加了2.3–2.4秒。一些检测显示,这完全取决于一个SQL查询:

SELECT TABLE_NAME AS name
FROM information_schema.tables
WHERE TABLE_SCHEMA = '<DBname>'
AND TABLE_NAME LIKE '<TablePrefix>%';
选择表名称作为名称
来自信息\u schema.tables
其中表_SCHEMA=“”
和表名称,如“%”;

我之所以使用它,是因为我想在结果集中显式地命名列。但是,使用备用查询对此进行编码会添加一行额外的代码,这些代码在中运行。信息架构没有优化,没有索引,只有带有元数据的表,通常,当您从架构中运行SELECT时,它会打开并读取文件


看看这篇文章-;在某些情况下,它会对您有所帮助。

对于那些可能需要一个小缺点的黑客:

它的作用是禁用一些在查询架构时更新的统计信息,更多信息如下:

为了让那些不想阅读的懒汉们更容易阅读,你只需要改变一下设置:

innodb_stats_on_metadata=0
您可以在配置文件中或动态执行此操作:

mysql> set global innodb_stats_on_metadata=0;

德凡特,谢谢你。我在tablename上使用了一个常量DB name和常量模式作为类似于'prefix_u%'的子句,因此查询接近最佳状态。但是,我也查看了本节的5.0和5.1版本。5.1版本澄清了这些性能优化仅在5.1.21中引入,因此我假设不适用于5.0.92。因此,MySQL引擎最多只能进行数据库目录扫描以返回此信息。此表中的“ENGINE=MEMORY”子句具有误导性。我仍然无法理解为什么show版本如此之快。我对show TABLES LIKE语句进行了mysqld扫描,这执行了DB dir的openat(),获取dir条目,然后打开与模式匹配的表的每个FRM文件,但这些都在我的系统上的VFAT缓存中,所以这需要几毫秒。SELECT语句的事件速度更快,因为它执行相同的openat()+getents(),但不打开FRM文件。所以我猜这是我的主机提供商仍然使用MySQL 5.0的一个功能。你的ans将我推向了正确的方向,并帮助我自己回答了这个问题。遗憾的是,我把旧的Ubuntu 8.04虚拟机弄得一团糟,因此我没有运行MySQL 5.0的LAMP堆栈,我无法使用,但我很高兴我的查询和完整扫描的未优化方面是根本问题。感谢您的反馈,但这是MySQL对MyISAM的问题,我最终将MySQL守护进程分为5.0和5.1两个版本,以了解到底。您的修复不会帮助OQ。请注意,innodb_stats_on_元数据设置在MySQL 5.0中不可用
mysql> set global innodb_stats_on_metadata=0;