phpmyadmin にログインして、データベースをすばやく確認できます。それらの 1 つをクリックしてテーブル リストを表示しようとすると、非常に遅くなります。足りないものはありますか?Ubuntu 10.04 から Ubuntu 12.04 に更新する前は、このような状況はありませんでした。
8 に答える
ファイルを開き、\config.inc.php
次の 2 行を追加します。
$cfg['MaxExactCount'] = 0;
$cfg['MaxExactCountViews'] = 0;
もちろん、データベースにビューがない場合、2 行目はスキップできます。
これは、多数の行を持つ innoDB テーブルがあるためです。InnoDB はテーブルに行数を格納しませんが、MyISAM は格納します。そのため、InnoDB テーブルごとに、行数が非常に多い場合、PHPMyAdminSELECT count(*) FROM
は非常に遅いクエリを呼び出します。これを解決するには、config.inc.php
ファイルを編集して$cfg['MaxExactCount']
. これにより、行count(*)
数が少ないテーブルに対して sqlが呼び出されMaxExactCount
ます。
$cfg['MaxExactCount'] = 20000;
意味 フォーム phpmyadmin マニュアル
InnoDB テーブルの場合、phpMyAdmin が SELECT COUNT を使用して正確な行数を取得するテーブルの大きさを決定します。SHOW TABLE STATUS によって返されるおおよその行数がこの値より小さい場合は SELECT COUNT が使用され、それ以外の場合はおおよその数が使用されます。
ローカル サーバーで実行されている phpMyAdmin の速度低下のもう 1 つの原因は、hosts ファイルを明らかに無視していることにあります。config.inc.php 内の「localhost」を「127.0.0.1」に変更してみてください。これは、Windows コンピューターで私にとって大きなスピードアップをもたらしました。
多数の (>10^5) レコードを持つ複数のビューがある場合、MaxExactCountViews と MaxExactCount の両方が 100 に設定されていても、動作が非常に遅くなります。
探す
「静的パブリック関数 countRecords」
の
libraries\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 は、常にすべての VIEW に対してこの値を表示するようになりました。また、はるかに高速に動作します:-)
私があなたの問題を解決した方法は、の出力をfiSHOW TABLE STATUS FROM <DATABASE>
という名前のテーブルに、たとえば 2 分ごとにキャッシュすることでした。これは、データベースの cron スクリプトを使用して行うことができます。 showtablecache
次に、ファイルを編集して/usr/share/phpmyadmin/libraries/database_interface.lib.php
、スローSHOW TABLE STATUS FROM ...
をSELECT ... FROM showtablecache WHERE ...
新しいキャッシュ テーブルの に置き換えることができます。
また、phpmyadmin ソースをそのままにして、間に mysql-proxy インスタンスを配置することもできます。これにより、クエリが書き換えられます。あとは $dbport 変数を変更するだけですconfig-db.php
:)
これに mysql-proxy を使用すると、phpmyadmin 以外の非オープン ソース ツールでこの問題が発生した場合に特に役立ちます。ネイティブの、おそらく独自のワークベンチ アプリケーションのように。(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をご覧ください。
$force_exact
私はもともと @"Andrew Kondratev" の回答を "if view" 条件付きのものなしで使用し、その後、そのメソッドの残りの部分を詳しく調べ始め、それが false の場合に実行されるコードとほぼ同じであることに気付きました。私は、それほど壊れず、テーブルでも機能する、より単純な新しいハックを持っています。
アンドリューのハックと同じように:
rpm -ql phpMyAdmin | grep Table.class.php
(またはローカルOSの同等物)など、インストールが存在する場所を見つけます。- 編集:(
./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
テーブルの表示中に $force_exact を true に設定するtbl_info.inc.php では、問題は実際には終わっていると思います。IMO、その数字が「正確」である必要があるのは、最後のページを表示しようとしている場合だけであり、それでもおそらくそうではありません。