2012-12-25 13 views
8

Posso accedere a phpmyadmin e vedere i database molto velocemente. Una volta che clicco su uno di essi e provo a vedere l'elenco delle tabelle, è molto lento. C'è qualcosa che mi manca? Non avevo questa situazione prima di aggiornare da Ubuntu 10.04 a Ubuntu 12.04.phpmyadmin apre molto lentamente le liste di tabelle MySQL

+0

Elimina e installa il pacchetto php5-mysql – Tachyons

+0

Questo particolare database ha una tabella innoDB con molte righe? –

+0

sì, usiamo un sacco di tabelle innoDB, alcune di loro hanno milioni di righe. – user1859451

risposta

6

Questo perché le tabelle innoDB contengono molte righe. InnoDB non memorizza il numero di righe in una tabella ma MyISAM lo fa. Quindi, per ogni tabella InnoDB, PHPMyAdmin richiama la query SELECT count(*) FROM che è molto lenta se il numero di righe è molto alto. Per risolvere questo problema, è necessario modificare il file config.inc.php e impostare $cfg['MaxExactCount']. Ciò invocherà count(*) sql per le tabelle che contengono meno MaxExactCount righe.

$cfg['MaxExactCount'] = 20000; 

Senso manuale forma phpmyadmin

Per le tabelle InnoDB, determina per come tavoli grandi phpMyAdmin dovrebbe ottenere l'esatto conteggio fila utilizzando SELECT COUNT. Se il conteggio approssimativo delle righe restituito da SHOW TABLE STATUS è inferiore a questo valore, verrà utilizzato SELECT COUNT, altrimenti verrà utilizzato il conteggio approssimativo.

+0

predefinito 'MaxExactCount' è 20000, proviamo anche a diminuire a 2000, non ha funzionato :( – user1859451

+0

oh, trovo il comando lento."MOSTRA TABLE STATUS FROM' db_staging' "; phpmyadmin eseguirà questo comando durante il caricamento dell'elenco delle tabelle. Ci vogliono 7 secondi per terminare questo comando. – user1859451

+0

Ho dovuto impostare $ cfg ['MaxExactCount'] su 0 affinché funzionasse come 20000 non funzionava. ** $ cfg ['MaxExactCount'] = 0 **; – IvanD

1

Nel caso in cui si dispone di diverse opinioni con lotti (> 10^5) di record funziona terribilmente lento anche quando MaxExactCountViews e MaxExactCount entrambi impostati a 100.

Trova

'static countRecords funzioni pubbliche

in

librerie \ Table.class.php

, inserire codice riportato di seguito all'inizio di questo metodo:

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'] valore in config dopo. phpMyAdmin ora mostrerà sempre questo valore per tutte le VISUALIZZAZIONI. Funzionerà anche molto più velocemente :-)

+0

Ho usato questo trucco senza l'istruzione condizionale. Ho avuto lo stesso problema facendo 'select count (*) da db.table' dopo aver fatto clic sulle tabelle. Con 16-25 milioni di righe in tabelle innodb, questo è un no-no. – TommyTheKid

1

Il modo in cui ho risolto il problema è stato il caching dell'output di SHOW TABLE STATUS FROM <DATABASE> in una tabella denominata f.i.showtablecache, dire ogni 2 minuti. Puoi farlo con qualche script cron per i tuoi database.

È quindi possibile modificare il file /usr/share/phpmyadmin/libraries/database_interface.lib.php e sostituire il SHOW TABLE STATUS FROM ... lento con uno SELECT ... FROM showtablecache WHERE ... nella nuova tabella della cache.

Si potrebbe anche lasciare la sorgente phpmyadmin da sola e inserire un'istanza mysql-proxy tra quella che riscrive la query. Tutto quello che devi fare è cambiare la variabile $ dbport in config-db.php :)

Utilizzare mysql-proxy per questo è particolarmente utile se si ha questo problema con uno strumento non open source diverso da phpmyadmin. Come alcune applicazioni native, magari proprietarie del banco di lavoro.(Database Workbench da Upscene fa qualcosa di simile (se ricordo bene))


Richieste nello script 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; 

Così, invece di SHOW TABLE STATUS FROM <DATABASE> si utilizza:

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>; 

Maggiori dettagli su questa correzione qui: http://blog.cppse.nl/fix-slow-phpmyadmin

7

Open \ config.inc.php e aggiungere questi due riga di codice a esso:

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

E naturalmente si può saltare la seconda riga se non ci sono viste nel database.

+1

Meglio RISOLTO mai! phpmyadmin è superveloce! Grazie... –

2

Inizialmente ho utilizzato la risposta "Andrew Kondratev", senza le condizioni condizionali "if view", quindi ho iniziato a guardare più da vicino il resto del metodo e ho capito che era quasi esattamente il codice che sarebbe stato eseguito se $force_exact era falso . Ho un nuovo hack più semplice che non si rompe abbastanza e funziona anche per le tabelle .

Proprio come con trucco di Andrew:

  • Trova dove le vite di installazione, come ad esempio rpm -ql phpMyAdmin | grep Table.class.php (o il vostro sistema operativo equivalente locale).
  • EDIT: ./libraries/Table.class.php (nel mio caso /usr/share/phpMyAdmin/libraries/Table.class.php
  • Cercare static public function countRecords (linea 563 nel mio caso)
  • Inserire il seguente nella parte superiore di tale funzione (dopo il {):

     /* Tommy's Hack from http://goo.gl/HMTnLc */ 
         $force_exact = false; 
         /* End Tommy's Hack - USE AT YOUR OWN RISK! */ 
    
  • Nel mio caso le "impostazioni predefinite" hanno già le seguenti:

    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; 
    
  • Tuttavia, è sempre possibile aggiungere al vostro 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 
    

Credo che il problema è in realtà più in tbl_info.inc.php dove si imposta $ force_exact true durante la visualizzazione di tabelle. IMO, l'unica volta che quel numero dovrebbe essere "esatto" è se stavi cercando di visualizzare l'ultima pagina, e anche allora probabilmente no.

Problemi correlati