muestra el nombre de la tabla + número de registros para cada tabla en una base de datos mysql innodb

10

Cómo enumerar todas las tablas en la base de datos actual, junto con el número de filas de la tabla.

En otras palabras, ¿se te ocurre una consulta para hacer algo así en mysql?

+------------------------++------------------------+
| Tables_in_database     |  Number of rows         |
+------------------------++------------------------+
| database 1             |   1000                  |
| database 2             |   1500                  |
+------------------------++------------------------+

Diferentes enfoques son bienvenidos.

sjdh
fuente
¿Estás utilizando MyISAM o InnoDB? ¿Has mirado esta pregunta ?
Aaron Bertrand
@AaronBertrand Gracias, esa pregunta es interesante. Yo uso innodb
sjdh

Respuestas:

8

Tengo un enfoque muy agresivo utilizando fuerza bruta SQL dinámico

SET group_concat_max_len = 1024 * 1024 * 100;
SELECT CONCAT('SELECT * FROM (',GROUP_CONCAT(CONCAT('SELECT ',QUOTE(tb),' Tables_in_database,
COUNT(1) "Number of Rows" FROM ',db,'.',tb) SEPARATOR ' UNION '),') A;')
INTO @sql FROM (SELECT table_schema db,table_name tb
FROM information_schema.tables WHERE table_schema = DATABASE()) A;
PREPARE s FROM @sql; EXECUTE s; DEALLOCATE PREPARE s;

Ejemplo: en mi base de datos de prueba, obtengo esto

mysql> use test
Database changed
mysql> SET group_concat_max_len = 1024 * 1024 * 100;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT CONCAT('SELECT * FROM (',GROUP_CONCAT(CONCAT('SELECT ',QUOTE(tb),' Tables_in_database,
    '> COUNT(1) "Number of Rows" FROM ',db,'.',tb) SEPARATOR ' UNION '),') A;')
    -> INTO @sql FROM (SELECT table_schema db,table_name tb
    -> FROM information_schema.tables WHERE table_schema = DATABASE()) A;
Query OK, 1 row affected (0.00 sec)

mysql> PREPARE s FROM @sql; EXECUTE s; DEALLOCATE PREPARE s;
Query OK, 0 rows affected (0.00 sec)
Statement prepared

+--------------------+----------------+
| Tables_in_database | Number of Rows |
+--------------------+----------------+
| biblio             |              3 |
| biblio_old         |              7 |
| dep                |              5 |
| e                  |             14 |
| emp                |              4 |
| fruit              |             12 |
| fruit_outoforder   |             12 |
| nums_composite     |              0 |
| nuoji              |              4 |
| prod               |              3 |
| prodcat            |              6 |
| test2              |              9 |
| worktable          |              5 |
| yoshi_scores       |             24 |
+--------------------+----------------+
14 rows in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

mysql>

DARLE UNA OPORTUNIDAD !!!

PRUEBA: Si todas las tablas son MyISAM, esto sucederá muy rápido. Si todas las tablas son InnoDB, se contará cada tabla. Esto puede ser brutal e implacable para tablas InnoDB muy grandes.

RolandoMySQLDBA
fuente
Este es un gran ejemplo de SQL dinámico. ¡Gracias!
sjdh
Traté de reemplazar FROM information_schema.tablespor FROM show tables. ¿Puedes explicar por qué eso no funciona?
sjdh
¡Guau, esto es extremadamente útil!
Tommy
Me encantaría ver una versión de esto que repita en todas las bases de datos. Intenté ejecutar SELECT DISTINCT table_schema FROM information_schema.tablespero no pude encontrar la forma de ajustar su consulta para ejecutar esos resultados. Si alguna vez descubro
Ryan
En realidad, descubrí que ya respondiste en dba.stackexchange.com/a/102284/18098 pero hay al menos un error tipográfico. Incluso después de arreglar "DEALLCOATE", no puedo ejecutar su versión de Todas las bases de datos. Estoy familiarizado conSELECT @CountSQL\G
Ryan
6

Pruebe a continuación la consulta sin consulta dinámica

SELECT Table_name AS TablesInDatabase ,table_rows AS NumberOfRows 
FROM information_schema.tables 
WHERE Table_schema=DATABASE(); 
Pydi Raju
fuente
1
Este método solo es confiable con una base de datos completa de MyISAM. InnoDB no almacena los recuentos de filas en ninguna parte de su arquitectura, ni en el INFORMATION_SCHEMA. (Ver mi publicación dba.stackexchange.com/questions/17926/… ). El enfoque dinámico frente a INFORMATION_SCHEMA es la única forma para las tablas InnoDB.
RolandoMySQLDBA
Gracias por compartir este método. Puedo confirmar que este método proporciona recuentos ligeramente diferentes para algunas de mis tablas. Todas mis tablas se almacenan en el motor de almacenamiento InnoDB.
sjdh
La mejor respuesta, funciona como encanto.
Pablo Pazos
1

Quizás esta consulta pueda ser de ayuda. Muestra el tamaño de los datos y la cantidad de registros.

SET @table=(SELECT DATABASE());
select @table;
SELECT 
     table_schema as `Database`, 
     table_name AS `Table`, 
     round(((data_length + index_length) / 1024 / 1024), 2) `Size in MB`,
     table_rows as 'Rows'
FROM information_schema.TABLES 
WHERE table_schema = @table
ORDER BY (data_length + index_length) DESC;
RikW
fuente
1

Obtenga recuentos de filas exactos para todas las tablas en MySQL utilizando el script de shell.

establecer parámetro en el archivo parameter.config como

# Server Details
host_server=10.109.25.37

# Mysql credentials
mysql_user=root
mysql_pass=root
mysql_port=3306

La secuencia de comandos para contar es:

#!/bin/bash
# This Script is used to take rows count of mysql all user database

# Read Parameter
source parameter.config

# Find path
MY_PATH="`dirname \"$0\"`"
#echo "$MY_PATH"

start=`date +%s`
echo -e "\n\n"
echo MySQL script start runing at Date and Time is: `date +"%D %T"`
echo -e "@@@ Start of rows Count of MySQL on Old Ficus Release $host_server @@@"

echo -e "\n***** MySQL Rows Count Start *****"

#Make directory to save rows count
NOW="$(date +%Y%m%dT%H%M%S)"
dir_name="mysqlRows_$host_server"
if [ ! -d "$MY_PATH/$dir_name" ]; then
    mkdir "$MY_PATH/$dir_name"
fi
echo -e "\n..... Directory $dir_name is Created for mysql....."

echo -e "\n..... Check MySQL Connection ....."
# Verifying mysql connections on new release machine
MYSQL_CONN="-u$mysql_user -p$mysql_pass -h$host_server"
mysql ${MYSQL_CONN} -e "exit"
if [ $? -eq 0 ];
then
    echo -e "\n..... MySQL Database Connection Successful on server $host_server ....."
else
    echo -e "\n..... MySQL Database Connection Fail. Please verify $host_server credential ....."
    exit
fi

echo -e "\nReading MySQL database names..."
mysql ${MYSQL_CONN} -ANe "SELECT schema_name FROM information_schema.schemata WHERE schema_name NOT IN ('mysql','information_schema','performance_schema')" > $MY_PATH/$dir_name/dbs_$NOW.txt
DBS="$(cat $MY_PATH/$dir_name/dbs_$NOW.txt)"
# echo -e "\nList of databases:\t" ${DBS}

echo -e "\n..... Running for row count of tables of all user databases ....."

# All User databases
for db in ${DBS[@]}
do
    # echo $db , ${db[@]} 
    # Find list of database
    echo -e "\n\t... Running for ${db[@]} database tables list ..."
    mysql ${MYSQL_CONN} -ANe "SELECT  TABLE_NAME FROM information_schema.TABLES WHERE  TABLE_SCHEMA IN ('${db[@]}')" > $MY_PATH/$dir_name/${db[@]}_tables_$NOW.txt
    TBL="$(cat $MY_PATH/$dir_name/${db[@]}_tables_$NOW.txt)"
    # echo "Table in $db are:" ${TBL[@]}, $MY_PATH/$dir_name/${db[@]}_tables.txt

    echo -e "\n\t... Running for ${db[@]} database tables rows count ..."
    for tbs in ${TBL[@]}
    do
        # echo $tbs , ${tbs[@]}
        count=$(mysql -u$mysql_user -p$mysql_pass -h$host_server ${db[@]} -N -e "select count(*) from ${tbs[@]}")
        # count="$(cat /tmp/$db_rows_$NOW.txt)"
        # echo "Row in $tb Table of $db database are:" ${count[@]}
        echo -e "${db[@]},${tbs[@]},$count" >> $MY_PATH/$dir_name/${db[@]}_rows_$NOW.csv
        echo -e "${db[@]},${tbs[@]},$count" >> $MY_PATH/$dir_name/alldbs_rows_$NOW.csv
    done
done
echo -e "\n..... End of rows count of tables of all databases ....."

echo -e "\n===== MySQL Rows Count End ====="

# Display script execution time.
echo -e "@@@ Completion of Rows Count of MySQL on old Release $host_server @@@"
echo Script ended at Date and Time is: `date +"%D %T"`
end=`date +%s`
runtime=$((end-start))
echo -e "Time(in second) taken for running MySQL row count script:" $runtime "Sec."

guarda esto en el archivo "mysqlrowscount.sh", ejecuta este script usando el comando:

bash mysqlrowscount.sh
Sarita
fuente