Задавайте вопросы, мы ответим
Вы не зашли.
Имеется таблица с тремя полями - два 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
Неактивен