SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 04.11.2009 01:23:54

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 849

Вопрос по поводу SHOW TABLE STATUS

Имеется таблица с тремя полями - два INT, одно - TIMESTAMP. Итого 12 байт (или даже меньше?).
Есть индекс на TIMESTAMP.

SHOW TABLE STATUS показывает вместо 12-ти байт 41. Почему так получается?

Неактивен

 

#2 05.11.2009 13:24:53

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Вопрос по поводу SHOW TABLE STATUS

SHOW CREATE TABLE?

Неактивен

 

#3 06.11.2009 10:54:36

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 849

Re: Вопрос по поводу SHOW TABLE STATUS

Не хотел засорять эфир, ну ладно

Код:

CREATE TABLE `sessions` (
  `siteid` int(10) unsigned NOT NULL,
  `sessionkey` binary(4) NOT NULL DEFAULT '0\0\0\0',
  `DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`siteid`,`sessionkey`),
  KEY `DATE` (`DATE`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=FIXED

Тогда уж и SHOW TABLE STATUS (теперь avg_row_legnth уже другое показывает, ну ладно, все равно больше, чем надо):

Код:

SHOW TABLE STATUS LIKE 'sessions'\G
*************************** 1. row ***************************
           Name: sessions
         Engine: InnoDB
        Version: 10
     Row_format: Compact
           Rows: 694319
 Avg_row_length: 52
    Data_length: 36126720
Max_data_length: 0
   Index_length: 23117824
      Data_free: 28311552
 Auto_increment: NULL
    Create_time: 2009-11-02 00:00:21
    Update_time: NULL
     Check_time: NULL
      Collation: latin1_swedish_ci
       Checksum: NULL
 Create_options: row_format=FIXED
        Comment:
1 row in set (0.02 sec)

Неактивен

 

#4 06.11.2009 13:52:46

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Вопрос по поводу SHOW TABLE STATUS

В MyISAM получается 13 байт. В InnoDB, статусная информация считается не честно,
поэтому, скорее всего, тоже 13 байт, но по индексу спускаешься неудачно smile

Неактивен

 

#5 06.11.2009 13:59:15

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 849

Re: Вопрос по поводу SHOW TABLE STATUS

по индексу спускаешься неудачно

Что значит "спускаться по индексу"?

Неактивен

 

#6 06.11.2009 14:12:15

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Вопрос по поводу SHOW TABLE STATUS

Ну, InnoDB когда статус считает — он спускается от корня B-Tree до какой-то leaf-ноды.
В зависимости от количества прыжков, он оценивает данные во всей таблице. Например,
количество строк может скакать немного в зависимости от пути спуска. Это всегда
приблизительные данные. Влиять на это ты никак не можешь.

Неактивен

 

#7 06.11.2009 14:28:33

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 849

Re: Вопрос по поводу SHOW TABLE STATUS

Т.е. значение data length - это не фактическое место на диске, а оценочная приблизительная величина?

В MyISAM получается 13 байт

Почему 13? Должно быть 4*3=12, я думал..

Неактивен

 

#8 06.11.2009 15:07:33

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Вопрос по поводу SHOW TABLE STATUS

Хыы, похоже, это бага sad

[aquatica] root test > create table z (z int not null);
Query OK, 0 rows affected (0,05 sec)

[aquatica] root test > insert z values (1);
Query OK, 1 row affected (0,00 sec)

[aquatica] root test > show table status like 'z'\G
*************************** 1. row ***************************
           Name: z
         Engine: MyISAM
        Version: 10
     Row_format: Fixed
           Rows: 1
 Avg_row_length: 7
    Data_length: 7
Max_data_length: 1970324836974591
   Index_length: 1024
      Data_free: 0
 Auto_increment: NULL
    Create_time: 2009-11-06 15:16:13
    Update_time: 2009-11-06 15:16:17
     Check_time: NULL
      Collation: latin1_swedish_ci
       Checksum: NULL
 Create_options:
        Comment:
1 row in set (0,00 sec)


В 5.0 то же самое, так что не привнесенная.

Неактивен

 

#9 07.11.2009 03:19:55

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 849

Re: Вопрос по поводу SHOW TABLE STATUS

Ну так а все-таки, какие величины имеют фактическое значение - те, что реальны (12 байт), или те, что считает SHOW CREATE TABLE?
А то мало ли, может, сервер если считает, что поле в 4 раза длиннее, чем есть, то соответственно и тормозит?

Неактивен

 

#10 07.11.2009 14:18:51

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Вопрос по поводу SHOW TABLE STATUS

Реально MyISAM табличка с одним полем INT использует 7 байт на строку.
Не знаю, почему, правда. Могу попробовать спросить у Тобиаса, может, он
знает smile

Неактивен

 

#11 07.11.2009 14:33:44

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 849

Re: Вопрос по поводу SHOW TABLE STATUS

Попробуй smile
Надеюсь, это не значит, что InnoDB использует на три четырехбайтовых поля столько, сколько показывает...

Неактивен

 

#12 11.11.2009 17:13:03

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Вопрос по поводу SHOW TABLE STATUS

Пообщался с Тобиасом, ситуация интересная smile

1. MyISAM работает честно с одним условием: на каждую строку выделяется всегда
один байт (независимо от того, есть ли колонки NULL): в нем хранится информация
о том, удалена ли строка. Поэтому до 7 NULLов на таблицу не увеличивают ее в
размере wink

2. Случай с одним интом вносит некоторые дополнительные особенности: каждая
строка должна быть не меньше размера указателя на строки в этой таблице.
Т.е. ALTER TABLE tablename MAX_ROWS=100 делает размер строки в таблице
равным пяти (INT + байт из п.1).

InnoDB хранит данные структурированно, поэтому показывает приблизительный
размер с учетом структуры.

Неактивен

 

#13 15.03.2013 08:49:03

gekakos
Участник
Зарегистрирован: 22.03.2009
Сообщений: 7

Re: Вопрос по поводу SHOW TABLE STATUS

Подскажите, пожалуйста, можно ли что-то сделать, если запрос

SHOW TABLE STATUS LIKE 'xxx'


упорно возвращает поле Rows = 0, хотя данные активно вносятся в таблицу.
Очень неудобно, в ряде случаев надо быстро и приблизительно посчитать кол-во элементов таблицы.

Engine = InnoDB (10)
MySQL version 5.6.4

Неактивен

 

#14 15.03.2013 11:59:08

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: Вопрос по поводу SHOW TABLE STATUS

gekakos написал:

Подскажите, пожалуйста, можно ли что-то сделать, если запрос

SHOW TABLE STATUS LIKE 'xxx'


упорно возвращает поле Rows = 0, хотя данные активно вносятся в таблицу.
Очень неудобно, в ряде случаев надо быстро и приблизительно посчитать кол-во элементов таблицы.

Engine = InnoDB (10)
MySQL version 5.6.4

Все верно

SHOW TABLE STATUS LIKE 'xxx'

должен показать детали таблицы xxx

Неактивен

 

#15 15.03.2013 14:37:47

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Вопрос по поводу SHOW TABLE STATUS

Статистика должна обновляться, хотя периодичность обновления не документирована. Если все время ноль, то это похоже на багу, стоит сообщить на bugs.mysql.com

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson