MySQL: Определение размера таблицы

Рубрика: MySQL | 8 January 2009, 18:11 | Vadim Voituk

Вот такой вот интересный запрос случайно выудил из документации MySQL:

SELECT
    table_name AS table_name,
    engine,
    ROUND(data_length/1024/1024,2) AS total_size_mb,
    table_rows
FROM
    information_schema.tables
WHERE
    table_schema=DATABASE();

Показывает обьем и количество строк в таблицах MySQL.
Результат выглядит приблизительно так:

+-------------------+--------+---------------+------------+
| table_name        | engine | total_size_mb | table_rows |
+-------------------+--------+---------------+------------+
| categories        | MyISAM |          0.00 |         17 |
| downloadlinks     | InnoDB |         13.02 |      19158 |
| errors            | InnoDB |         15.02 |      84104 |
| lastdownloads     | MEMORY |          3.19 |        524 |
| providers         | MyISAM |          0.00 |         17 |
| starstags         | InnoDB |          1.52 |      14323 |
| tagids            | InnoDB |         35.59 |     759694 |
| tags              | InnoDB |       2036.00 |   21971934 |
| vars              | InnoDB |          0.02 |         51 |
| videocategories   | InnoDB |         49.58 |    1583675 |
| videos            | InnoDB |       1864.00 |    1954427 |
| videos_deleted    | MyISAM |         56.33 |      75889 |
| videostats2       | InnoDB |        271.88 |    3417776 |
| videostats2_daily | InnoDB |          0.02 |        266 |
+-------------------+--------+---------------+------------+

Правда есть один нюанс: на InnoDB-таблицах показывает количество незалоченных в данный момент строк.

P.S. А кто-то пробовал использовать ARCHIVE storage engine?
Как он в плане fail-over и repair?
Поделитесь good/bad experience?

Комментариев: 13

13 Responses to “MySQL: Определение размера таблицы”

Комментарии:

  1. MGYK

    Использую, уже больше года ARCHIVE как раз для архивов :)
    + Данные хорошо сжимаются. По сравниению с gzip дампа, больше в 1.5-2 раза.
    + Очень быстро проходит fullscan таблицы, для тяжелых запросов по которым сложно собрать правильный индекс работает значительно быстрее, чем myisam

    - Очень долго выполняется проверка таблиц, у меня архивных таблиц на 20гиг при рестарте сервера это 1-1.5 проверки.
    - Нельзя удалять данные из таблицы.

    Если использовать по прямому предназначению, то это великолепное решение, в остальных случаях надо хорошо думать и все взвешивать.

  2. MGYK

    * при рестарте сервера 1-1.5 часа проверка идет

  3. Vadim Voituk

    Спасибо за отзыв – теперь обязательно буду пробовать.
    Тоесть я так понял что если вдруг нужно перезапустить MySQL – получаем полторачасовой downtime?

  4. Skaizer

    Хм, а я вот как узнаю размер:
    SHOW TABLE STATUS;
    А потом:

    while($each = $result->fetch_assoc()){ // в $result хранится результат запроса
        $dbSize=dbSize + $each['Data_length'];
    }
    if ($dbSize > 1048576){
        $dbSize = sprintf("%01.2f", $db_connect->dbSize()/1048576);
        $dbSize .= ' Мб';
    } else {
        $dbSize = sprintf("%01.2f", $db_connect->dbSize()/1024);
        $dbSize .= ' Кб';
    }

    Вроде так :)

  5. Vadim Voituk

    Skaizer,
    А вам не кажется что ваш способ немного неэффективен? :)

  6. Skaizer

    Возможно, применить его приходилось только 1 раз, работал адекватно :)

  7. corsair

    Знаю ще кльовий спосіб – в SQLite створити базу в неї скопіювати всі дані з мускуля і в фарі подивитися розмір фалійка %))
    Спосіб номер два – зробити select * from по всім таблицям і поміряти трафік %))

  8. Vadim Voituk

    corsair,
    Мсье знает толк в извратах.

  9. Андрей

    corsair, пишешь на украинском, а примеры индусские:))))

  10. Andrey F

    Автор поста сам немного извращенец. Я всегда пользуюсь (и всем советую) командой:
    mysqlshow -i имя_бд

    Сравнил результаты – одно и тоже.
    Enjoy!

  11. LJack

    Автор грамотно воспользовался статистикой и получил то что ему нужно в том виде в котором ему удобно, а вот mysqlshow до тошноты примитивная утилита которая пользуется той-же информацией… Вот она да, для извращенцев ;)

  12. сисадмин

    А кто-то может объяснить причину вот такого расхождения по инфе о количестве строк:

    mysql> show table status like ‘tblMy’ \G
    *************************** 1. row ***************************
    Name: tblDownloadCount
    Engine: InnoDB
    Version: 10
    Row_format: Compact
    Rows: 490267
    ^^^^^^^^^^^^^^^^^^^^^^^
    Avg_row_length: 71
    Data_length: 35225600
    Max_data_length: 0
    Index_length: 0
    Data_free: 7340032
    Auto_increment: NULL
    Create_time: 2013-09-05 15:55:24
    Update_time: NULL
    Check_time: NULL
    Collation: utf8_general_ci
    Checksum: NULL
    Create_options:
    Comment:
    1 row in set (0,00 sec)

    mysql> select count(*) from tblMy;
    +———-+
    | count(*) |
    +———-+
    | 465956 |
    +———-+
    1 row in set (0,08 sec)

  13. Vadim Voituk

    Это значит что 25K записей были удалены из таблицы, и их место в дата-файле не было переиспользовано.
    У меня намедни был аналогичный случай:
    Файл с данными 3Gb, статус показывает 3M записей, а count(*) – 30K записей.

Leave a Reply