phpmyadmin非常慢地打开MySQL表列表

时间:2012-12-25 03:09:32

标签: mysql phpmyadmin

我可以登录phpmyadmin并快速查看数据库。一旦我点击其中一个并尝试查看表格列表,它就会很慢。有什么我想念的吗?在从Ubuntu 10.04更新到Ubuntu 12.04之前我没有这种情况。

8 个答案:

答案 0 :(得分:7)

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

{{1}}

意思形式phpmyadmin手册

  

对于InnoDB表,确定phpMyAdmin应使用SELECT COUNT获取确切行数的大表。如果SHOW TABLE STATUS返回的近似行计数小于此值,将使用SELECT COUNT,否则将使用近似计数。

答案 1 :(得分:7)

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

$cfg['MaxExactCount'] = 0;
$cfg['MaxExactCountViews'] = 0;

如果您在数据库中没有任何观点,当然可以跳过第二行。

答案 2 :(得分:2)

如果您有多个包含许多(> 10 ^ 5)记录的VIEWS,即使MaxExactCountViews和MaxExactCount都设置为100,它的工作速度也非常慢。

查找

  

'静态公共函数countRecords'

in

  

库\ 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']; 
}
之后配置中的

Set $GLOBALS['cfg']['MaxExactCountViews']值。 phpMyAdmin现在将始终为所有VIEWS显示此值。它也会更快地工作: - )

答案 3 :(得分:2)

我最初使用的是@" Andrew Kondratev"回答,没有"如果查看"有条件的东西,然后开始仔细研究该方法的其余部分,并意识到这几乎就是$force_exact为假时运行的代码。我有一个新的,更简单的黑客,并没有那么多的破解,也适用于

就像安德鲁的黑客一样:

  • 查找安装所在的位置,例如rpm -ql phpMyAdmin | grep Table.class.php(或等效的本地操作系统)。
  • 编辑:./libraries/Table.class.php(在我的情况下为/usr/share/phpMyAdmin/libraries/Table.class.php
  • 寻找static public function countRecords(在我的案例中为第563行)
  • 在该函数的顶部插入以下内容({之后):

            /* Tommy's Hack from http://goo.gl/HMTnLc */
            $force_exact = false;
            /* End Tommy's Hack - USE AT YOUR OWN RISK! */
    
  • 在我的情况下,"默认"已经有以下内容:

    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
    

我相信问题实际上已经在tbl_info.inc.php中结束了,它在显示表时将$ force_exact设置为true。国际海事组织,这个号码唯一需要的时间是#34;确切的"是你试图查看最后一页,甚至可能不是。

答案 4 :(得分:1)

我解决问题的方法是将SHOW TABLE STATUS FROM <DATABASE>的输出缓存到名为 f.i。 showtablecache的表中,比如每2分钟一次。您可以使用数据库的某些cron脚本执行此操作。

然后,您可以编辑文件/usr/share/phpmyadmin/libraries/database_interface.lib.php,并在新缓存表上用SHOW TABLE STATUS FROM ...替换慢速SELECT ... FROM showtablecache WHERE ...

您也可以单独留下phpmyadmin源并在其间放置一个mysql代理实例,为您执行查询重写。您需要做的就是更改config-db.php中的$ dbport变量:)

如果您使用phpmyadmin之外的非开源工具出现此问题,则使用mysql-proxy非常有用。像一些原生的,也许是专有的工作台应用程序。 (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;

因此,您使用的是SHOW TABLE STATUS FROM <DATABASE>而不是

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>;

此处有关此修补程序的更多详细信息:http://blog.cppse.nl/fix-slow-phpmyadmin

答案 5 :(得分:0)

我针对您查询information_schema.tables

的一般情况发布了修补程序

Slow query on information_schema.tables

答案 6 :(得分:0)

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

答案 7 :(得分:0)

对我来说,问题是所有站点上都启用了xdebug分析器。在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