10

phpmyadmin にログインして、データベースをすばやく確認できます。それらの 1 つをクリックしてテーブル リストを表示しようとすると、非常に遅くなります。足りないものはありますか?Ubuntu 10.04 から Ubuntu 12.04 に更新する前は、このような状況はありませんでした。

4

8 に答える 8

11

ファイルを開き、\config.inc.php次の 2 行を追加します。

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

もちろん、データベースにビューがない場合、2 行目はスキップできます。

于 2014-04-30T17:52:45.600 に答える
7

これは、多数の行を持つ 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 が使用され、それ以外の場合はおおよその数が使用されます。

于 2012-12-25T03:27:53.543 に答える
4

ローカル サーバーで実行されている phpMyAdmin の速度低下のもう 1 つの原因は、hosts ファイルを明らかに無視していることにあります。config.inc.php 内の「localhost」を「127.0.0.1」に変更してみてください。これは、Windows コンピューターで私にとって大きなスピードアップをもたらしました。

于 2018-11-04T12:26:08.713 に答える
2

多数の (>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 に対してこの値を表示するようになりました。また、はるかに高速に動作します:-)

于 2013-03-11T02:21:44.357 に答える
2

私があなたの問題を解決した方法は、の出力を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をご覧ください。

于 2013-03-25T21:00:59.870 に答える
2

$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、その数字が「正確」である必要があるのは、最後のページを表示しようとしている場合だけであり、それでもおそらくそうではありません。

于 2014-11-14T17:55:24.127 に答える