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