phpmyadmin非常缓慢地打开MySQL表列表

phpmyadmin非常缓慢地打开MySQL表列表,mysql,phpmyadmin,Mysql,Phpmyadmin,我可以登录到phpmyadmin并很快查看数据库。一旦我点击其中一个并尝试查看表格列表,它就会非常慢。我有什么遗漏吗?在从Ubuntu10.04更新到Ubuntu12.04之前,我没有遇到过这种情况。这是因为innoDB表中有很多行。InnoDB不存储表中的行数,但MyISAM存储。因此,对于每个InnoDB表,PHPMyAdmin从查询中调用SELECT count(*),如果行数非常高,则调用速度非常慢。要解决此问题,您应该编辑config.inc.php文件并设置$cfg['MaxExac

我可以登录到phpmyadmin并很快查看数据库。一旦我点击其中一个并尝试查看表格列表,它就会非常慢。我有什么遗漏吗?在从Ubuntu10.04更新到Ubuntu12.04之前,我没有遇到过这种情况。

这是因为innoDB表中有很多行。InnoDB不存储表中的行数,但MyISAM存储。因此,对于每个InnoDB表,PHPMyAdmin从查询中调用
SELECT count(*),如果行数非常高,则调用速度非常慢。要解决此问题,您应该编辑
config.inc.php
文件并设置
$cfg['MaxExactCount']
。这将为行数较少的表调用
count(*)
sql

$cfg['MaxExactCount'] = 20000;
phpmyadmin手册的含义表

对于InnoDB表,确定phpMyAdmin应使用SELECT count获得多大表的确切行数。如果“显示表格状态”返回的近似行数小于此值,则将使用SELECT count,否则将使用近似行数


如果您有多个包含大量(>10^5)记录的视图,即使MaxExactCountViews和MaxExactCount都设置为100,它的运行速度也非常慢

发现

“静态公共功能记录”

库\Table.class.php

,将以下代码放在该方法的开头:

if ($is_view == true && isset($GLOBALS['cfg']['MaxExactCountViews'])) {
    /* dirty hack to avoid performance issue with views when ['cfg']['MaxExactCount'] and ['cfg']['MaxExactCountViews'] does not help it */
    $tmp_tables = PMA_DBI_get_tables_full($db, $table);
    PMA_Table::$cache[$db][$table] = $tmp_tables[$table];
    PMA_Table::$cache[$db][$table]['ExactRows'] = $GLOBALS['cfg']['MaxExactCountViews'];
    return (int) $GLOBALS['cfg']['MaxExactCountViews']; 
}

在配置中设置$GLOBALS['cfg']['MaxExactCountViews']
值。phpMyAdmin现在将始终为所有视图显示此值。它的工作速度也会快得多:-)

我解决问题的方法是将
显示表状态的输出从
缓存到名为f.I.
showtablecache
的表中,比如每2分钟缓存一次。您可以使用一些用于数据库的cron脚本来实现这一点

然后,您可以编辑文件
/usr/share/phpmyadmin/libraries/database_interface.lib.php
,并将慢速
显示表格状态从…
替换为
选择。。。从新缓存表上的showtablecache WHERE…

您还可以不使用phpmyadmin源代码,在两者之间放置一个mysql代理实例,为您执行查询重写。然后只需在
config db.php
:)中更改$dbport变量

如果您在phpmyadmin以外的非开源工具中遇到此问题,那么使用mysql代理进行此操作尤其有用。像一些本机的,可能是专有的工作台应用程序。(Upscene的数据库工作台做了类似的事情(如果我没记错的话))


在cron脚本中查询:

START TRANSACTION;

DELETE FROM showtablecache WHERE database_ = '<DATABASE>';

INSERT INTO showtablecache
SELECT 
    '<DATABASE>'
    , TABLE_NAME
    , ENGINE
    , VERSION
    , ROW_FORMAT
    , TABLE_ROWS
    , AVG_ROW_LENGTH
    , DATA_LENGTH
    , MAX_DATA_LENGTH
    , INDEX_LENGTH
    , DATA_FREE
    , AUTO_INCREMENT
    , CREATE_TIME
    , UPDATE_TIME
    , CHECK_TIME
    , TABLE_COLLATION
    , CHECKSUM
    , CREATE_OPTIONS
    , TABLE_COMMENT
FROM
    INFORMATION_SCHEMA.TABLES
WHERE
    table_schema = '<DATABASE>';

COMMIT;
启动事务;
从showtablecache中删除,其中数据库为\='';
插入到showtablecache中
挑选
''
,表格名称
,引擎
版本
,行格式
,表_行
,平均行长
,数据长度
,最大数据长度
,索引长度
,资料免费
,自动增量
,创建时间
,更新时间
,核对时间
,表(u)整理
,校验和
,创建_选项
,表(注释)
从…起
信息\u SCHEMA.TABLES
哪里
表_模式=“”;
犯罪
因此,您不必使用
显示表格状态,而是使用:

SELECT
    Name_ AS `Name`,
    Engine_ AS `Engine`,
    Version,
    Row_format_ AS `Row_format`,
    Rows_ AS `Rows`,
    Avg_row_length,
    Data_length,
    Max_data_length,
    Index_length,
    Data_free,
    Auto_increment_ AS `Auto_increment`,
    Create_time,
    Update_time,
    Check_time,
    Collation_ AS `Collation`,
    Checksum,
    Comment_ AS `Comment`,
    Create_options
FROM
    showtablecache
WHERE
    Database_ = <DATABASE>;
选择
名称uu为'Name`,
引擎作为“引擎”,
版本
行格式作为“行格式”,
行作为“行”,
平均行长,
数据长度,
最大数据长度,
索引长度,
数据免费,
自动增量作为“自动增量”,
创造时间,
更新时间,
检查时间,
排序规则作为“排序规则”,
校验和,
注释作为“注释”,
创建\u选项
从…起
可显示缓存
哪里
数据库_uz=;

有关此修复程序的更多详细信息,请参见此处:

我发布了一个修复程序,用于查询
信息\u schema.tables


打开\config.inc.php文件并在其中添加以下两行代码:

$cfg['MaxExactCount'] = 0;
$cfg['MaxExactCountViews'] = 0;
当然,如果在数据库中没有任何视图,您可以跳过第二行。

我最初使用的是“Andrew Kondratev”答案,没有“if view”条件,然后开始仔细研究该方法的其余部分,并意识到如果
$force\u exact
为false,则几乎完全可以运行该代码。我有一个新的,更简单的黑客,不打破太多,以及工作表

就像安德鲁的黑客一样:

  • 查找安装所在位置,例如
    rpm-ql phpMyAdmin | grep
    Table.class.php
    (或您本地的等效操作系统)
  • 编辑:
    /libraries/Table.class.php
    (在我的例子中是
    /usr/share/phpMyAdmin/libraries/Table.class.php
  • 查找
    静态公共函数countRecords
    (在我的例子中是第563行)
  • 在该函数的顶部(在
    {
    之后)插入以下内容:

  • 在我的情况下,“默认值”已经具有以下内容:

    config.default.php: * @global integer $cfg['MaxExactCount']
    config.default.php:$cfg['MaxExactCount'] = 0;
    config.default.php: * @global integer $cfg['MaxExactCountViews']
    config.default.php:$cfg['MaxExactCountViews'] = 0;
    
  • 但是,您始终可以将其添加到config.inc.php中:

    $cfg['MaxExactCountViews'] = 0;//disable trying to count the number of rows in any view
    $cfg['MaxExactCount'] = 0;//disable correcting the InnoDB estimates
    

我相信问题实际上已经结束了,它在显示表格时将$force_精确设置为true。在我看来,这个数字唯一需要“精确”的时间如果您正在尝试查看最后一页,那么即使这样也可能没有。

本地服务器上运行的phpMyAdmin的另一个缓慢原因是它明显忽略了主机文件。请尝试将config.inc.php中出现的任何“localhost”改为“127.0.0.1”。它在Windows计算机上为我带来了极大的加速。

对我来说,问题是所有站点都启用了xdebug profiler。在phpmyadmin中加载表列表时,它写入了超过40MB的日志。(关闭它将加载速度从15秒加速到2-3秒)

以下是我的新xdebug设置,我不知道是哪一个起了作用:

xdebug.profiler_enable=0
xdebug.profiler_enable_trigger=1 # this still allows manual logs
xdebug.remote_autostart=0
xdebug.remote_enable=0

清除并重新安装php5 mysql包特定数据库是否有任何包含大量行的innoDB表?是的,我们使用了大量innoDB表,其中一些有数百万行。在我们的暂存环境中速度非常慢,但在pr中
xdebug.profiler_enable=0
xdebug.profiler_enable_trigger=1 # this still allows manual logs
xdebug.remote_autostart=0
xdebug.remote_enable=0