prepared_query('SHOW CREATE TABLE ' . $match[1]); [,$definition] = $DB->next_record(MYSQLI_NUM, false); header('Content-type: text/plain'); echo $definition; exit; } } $SortOrderMap = [ 'datafree' => ['data_free', 'desc', 'free space'], 'datasize' => ['data_length', 'desc', 'table size'], 'freeratio' => ['CASE WHEN data_length = 0 THEN 0 ELSE data_free / data_length END', 'desc', 'table bloat'], 'indexsize' => ['index_length', 'desc', 'index size'], 'name' => ['table_name', 'asc', 'name'], 'rows' => ['table_rows', 'desc', 'row counts'], 'rowsize' => ['avg_row_length', 'desc', 'mean row length'], 'totalsize' => ['total_length', 'desc', 'total table size'], ]; $SortOrder = $_GET['order'] ?? 'totalsize'; $orderBy = $SortOrderMap[$SortOrder][0]; $orderWay = (empty($_GET['sort']) || $_GET['sort'] == $SortOrderMap[$SortOrder][1]) ? $SortOrderMap[$SortOrder][1] : SortableTableHeader::SORT_DIRS[$SortOrderMap[$SortOrder][1]]; $header = new SortableTableHeader([ 'datafree' => 'Free Size', 'datasize' => 'Data Size', 'freeratio' => 'Bloat %', 'indexsize' => 'Index Size', 'name' => 'Name', 'rows' => 'Rows', 'rowsize' => 'Row Size', 'totalsize' => 'Total Size', ], $SortOrder, $orderWay); $mode = $_GET['mode'] ?? 'show'; switch($mode) { case 'show': $tableColumn = 'table_name'; $where = ''; break; case 'merge': $tableColumn = "replace(table_name, 'deleted_', '')"; $where = ''; break; case 'exclude': $tableColumn = 'table_name'; $where = "AND table_name NOT LIKE 'deleted%'"; break; } $DB->prepared_query(" SELECT $tableColumn AS table_name, engine, sum(table_rows) AS table_rows, avg(avg_row_length) AS avg_row_length, sum(data_length) AS data_length, sum(index_length) AS index_length, sum(index_length + data_length) AS total_length, sum(data_free) AS data_free FROM information_schema.tables WHERE table_schema = ? $where GROUP BY $tableColumn, engine ORDER by $orderBy $orderWay ", SQLDB ); $Tables = $DB->to_array('table_name', MYSQLI_ASSOC); $data = []; foreach ($Tables as $name => $info) { switch ($SortOrder) { case 'freeratio': $data[$name] = round($info['data_length'] == 0 ? 0 : $info['data_free'] / $info['data_length'], 2); break; case 'totalsize': $data[$name] = $info['total_length']; break; default: $data[$name] = $info[$SortOrderMap[$SortOrder][0]]; } } View::show_header('Database Specifics'); ?>
| = $header->emit('name', $SortOrderMap['name'][1]) ?> | = $header->emit('rows', $SortOrderMap['rows'][1]) ?> | = $header->emit('rowsize', $SortOrderMap['rowsize'][1]) ?> | = $header->emit('datasize', $SortOrderMap['datasize'][1]) ?> | = $header->emit('indexsize', $SortOrderMap['indexsize'][1]) ?> | = $header->emit('datafree', $SortOrderMap['datafree'][1]) ?> | = $header->emit('freeratio', $SortOrderMap['freeratio'][1]) ?> | = $header->emit('totalsize', $SortOrderMap['totalsize'][1]) ?> |
| = $t['engine'] != 'InnoDB' ? '' : '' ?> = display_str($t['table_name']) ?> = $t['table_name'] == 'email' ? '' : '' ?> | = number_format($t['table_rows']) ?> | = Format::get_size($t['avg_row_length']) ?> | = Format::get_size($t['data_length']) ?> | = Format::get_size($t['index_length']) ?> | = Format::get_size($t['data_free']) ?> | = round($t['data_length'] == 0 ? 0 : ($t['data_free'] / $t['data_length']) * 100, 2) ?> | = Format::get_size($t['data_length'] + $t['index_length']) ?> |
| Grand totals | = number_format($TotalRows) ?> | = Format::get_size($TotalDataSize) ?> | = Format::get_size($TotalIndexSize) ?> | = Format::get_size($TotalFreeSize) ?> | = sprintf('%0.2f', $TotalDataSize == 0 ? 0 : ($TotalFreeSize / $TotalDataSize) * 100) ?> | = Format::get_size($TotalDataSize + $TotalIndexSize) ?> |