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