10

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

4

8 回答 8

11

打开\config.inc.php文件并附加这两行:

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

当然,如果数据库中没有任何视图,则可以跳过第二行。

于 2014-04-30T17:52:45.600 回答
7

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

$cfg['MaxExactCount'] = 20000;

含义形式 phpmyadmin 手册

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

于 2012-12-25T03:27:53.543 回答
4

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

于 2018-11-04T12:26:08.713 回答
2

我最初使用@“Andrew Kondratev”答案,没有“if view”条件的东西,然后开始仔细研究该方法的其余部分,并意识到这几乎正是如果$force_exact为假时将运行的代码。我有一个新的、更简单的 hack,它不会破坏太多并且也适用于表格

就像 Andrew 的 hack 一样:

  • 查找安装所在的位置,例如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。IMO,唯一需要“准确”的数字是如果您试图查看最后一页,即使那样也可能不是。

于 2014-11-14T17:55:24.127 回答
2

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

寻找

'静态公共函数 countRecords'

库\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 现在将始终为所有视图显示此值。它也会工作得更快:-)

于 2013-03-11T02:21:44.357 回答
2

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

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

您也可以单独保留 phpmyadmin 源,并在其间放置一个 mysql-proxy 实例,为您重写查询。然后您所要做的就是更改 $dbport 变量config-db.php:)

如果您在使用 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

于 2013-03-25T21:00:59.870 回答
1

对我来说,问题是所有站点都启用了 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
于 2019-07-08T02:28:17.743 回答
0

我针对您查询的一般情况发布了修复程序information_schema.tables

information_schema.tables 查询慢

于 2013-05-09T19:00:32.473 回答