我可以登录 phpmyadmin 并很快查看数据库。一旦我单击其中一个并尝试查看表格列表,它就会非常慢。有什么我想念的吗?在从 Ubuntu 10.04 更新到 Ubuntu 12.04 之前,我没有这种情况。
8 回答
打开\config.inc.php
文件并附加这两行:
$cfg['MaxExactCount'] = 0;
$cfg['MaxExactCountViews'] = 0;
当然,如果数据库中没有任何视图,则可以跳过第二行。
这是因为你有很多行的 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,否则将使用近似数。
phpMyAdmin 在本地服务器上运行缓慢的另一个原因是它明显忽略了 hosts 文件。尝试将 config.inc.php 中出现的任何“localhost”更改为“127.0.0.1”。它在 Windows 计算机上为我创造了极大的加速。
我最初使用@“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,唯一需要“准确”的数字是如果您试图查看最后一页,即使那样也可能不是。
如果您有多个包含大量 (>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 现在将始终为所有视图显示此值。它也会工作得更快:-)
我解决您的问题的方法是将 的输出缓存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
对我来说,问题是所有站点都启用了 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
我针对您查询的一般情况发布了修复程序information_schema.tables