【问题标题】:MySQL SELECT from INFORMATION_SCHEMA.COLUMNS taking > 1 minute从 INFORMATION_SCHEMA.COLUMNS 中选择 MySQL 需要 > 1 分钟
【发布时间】:2013-09-06 14:23:45
【问题描述】:

这是我的查询:

SELECT COLUMN_NAME 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = "transactions" 

这是花了多长时间:

Showing rows 0 - 29 ( 36 total, Query took 61.8934 sec)

我不是 dba,但这不正常,是吗?我是否应该期望查询 INFORMATION_SCHEMA 需要一分钟以上的时间?我在这里做错了什么吗?我是否需要添加索引或其他内容才能获得正常响应?

--- 编辑以解决问题

版本 5.5.30-30.2

此数据库由 HostGator 托管

EXPLAIN SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = "transactions"

id  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra
1   SIMPLE  COLUMNS     ALL     NULL    TABLE_NAME  NULL    NULL    NULL    Using where; Open_frm_only; Scanned 1 database

显示创建表事务:

transactions    CREATE TABLE `transactions` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `accountId` int(11) NOT NULL DEFAULT '0',
 `contractId` int(11) NOT NULL DEFAULT '0',
 `insertionId` int(11) NOT NULL DEFAULT '0',
 `aNetCIMProfileId` int(11) NOT NULL DEFAULT '0',
 `paymentProfileId` int(11) NOT NULL DEFAULT '0',
 `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
 `wasSuccessful` tinyint(1) NOT NULL DEFAULT '0',
 `amount` int(11) NOT NULL DEFAULT '0',
 `resultText` varchar(255) NOT NULL,
 `authNetTransactionId` bigint(20) NOT NULL DEFAULT '0',
 `isChargedBack` tinyint(1) NOT NULL DEFAULT '0',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=41 DEFAULT CHARSET=latin1

SELECT Count( * )
FROM INFORMATION_SCHEMA.COLUMNS

[这也花了 > 1 分钟]

1303

SELECT COLUMN_NAME 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = "transactions" 
    AND TABLE_SCHEMA = 'mydbname'

同样的响应时间

SET global innodb_stats_on_metadata = 0;
#1227 - Access denied; you need (at least one of) the SUPER privilege(s) for this operation

(此数据库由 HostGator 托管)

【问题讨论】:

  • 是的,这绝对不正常,不,你不应该弄乱 mysql.* 数据库中的表结构。这是 mysql 几乎所有功能都使用的内部数据库。如果您开始做任何事情但从那里选择数据,您可以完全使用您的设置。打开你的慢查询日志,开始追踪为什么这么简单的查询要花很长时间。
  • 你能告诉我们show create table....explain select .....
  • information_schema.columns 有多少行?即SELECT Count(*) ...
  • 根据this,在WHERE 中添加TABLE_SCHEMA 可能会有所帮助。
  • Database Administrators 可能更适合此类数据库问题。

标签: mysql


【解决方案1】:
SELECT COLUMN_NAME,TABLE_NAME 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME like  "%transactions%" 
    AND TABLE_SCHEMA = 'mydbname'

在 TABLE_SCHEMA 中提供数据库名称 mydbname。 在共享主机上,如果您可以访问,则需要更多时间,然后它会显示结果。

【讨论】:

    【解决方案2】:

    如果您有很多数据库和表,INFORMATION_SCHEMA 的性能早已众所周知。

    MySQL 在每个主要版本中都会提高 I_S 的性能,因此您需要尽可能升级到当前版本。

    您还应该设置服务器选项innodb_stats_on_metadata=0,这会有所帮助。当您查询 I_S 时,它会降低统计信息收集的成本。在 MySQL 5.6.6 及更高版本中,默认为 0。

    在 MySQL 8.0 中,他们完全重新设计了 I_S 的内部结构,因此应该会获得更好的性能。

    【讨论】:

      猜你喜欢
      • 2016-04-22
      • 1970-01-01
      • 2019-07-24
      • 1970-01-01
      • 2017-07-23
      • 2019-03-10
      • 1970-01-01
      • 2021-04-27
      • 1970-01-01
      相关资源
      最近更新 更多