![]() |
Задавайте вопросы, мы ответим
Вы не зашли.

Имеется таблица с тремя полями - два INT, одно - TIMESTAMP. Итого 12 байт (или даже меньше?).
Есть индекс на TIMESTAMP.
SHOW TABLE STATUS показывает вместо 12-ти байт 41. Почему так получается?
Неактивен

SHOW CREATE TABLE?
Неактивен

Не хотел засорять эфир, ну ладно
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)Неактивен

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

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

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

Т.е. значение data length - это не фактическое место на диске, а оценочная приблизительная величина?
В MyISAM получается 13 байт
Почему 13? Должно быть 4*3=12, я думал..
Неактивен

Хыы, похоже, это бага ![]()
Неактивен

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

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

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

Пообщался с Тобиасом, ситуация интересная ![]()
1. MyISAM работает честно с одним условием: на каждую строку выделяется всегда
один байт (независимо от того, есть ли колонки NULL): в нем хранится информация
о том, удалена ли строка. Поэтому до 7 NULLов на таблицу не увеличивают ее в
размере ![]()
2. Случай с одним интом вносит некоторые дополнительные особенности: каждая
строка должна быть не меньше размера указателя на строки в этой таблице.
Т.е. ALTER TABLE tablename MAX_ROWS=100 делает размер строки в таблице
равным пяти (INT + байт из п.1).
InnoDB хранит данные структурированно, поэтому показывает приблизительный
размер с учетом структуры.
Неактивен
Подскажите, пожалуйста, можно ли что-то сделать, если запрос
Неактивен
gekakos написал:
Подскажите, пожалуйста, можно ли что-то сделать, если запрос
SHOW TABLE STATUS LIKE 'xxx'
упорно возвращает поле Rows = 0, хотя данные активно вносятся в таблицу.
Очень неудобно, в ряде случаев надо быстро и приблизительно посчитать кол-во элементов таблицы.
Engine = InnoDB (10)
MySQL version 5.6.4
Все верно
Неактивен

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