2009-07-28 1 views
3

MySQL 4.0 не имеет information_schema и 'show table status from db' дает приблизительный подсчет строк для таблиц innodb.Каков самый быстрый способ получить количество строк innodb tables, в mysql 4.0?

Итак, какой самый быстрый способ получить подсчет столов innodb, конечно, кроме count (*), который может быть медленнее с большими таблицами.

+0

два вопроса: Почему вы используете MySQL 4.0? Это древний и неподдерживаемый. Зачем вам нужен точный подсчет всей таблицы? – hobodave

+0

Оказывается, оба ваших вопроса связаны: Im фактически обновляет от 4.0 до 5.0 и, назовите меня параноидальным или что-то в этом роде, но я хотел убедиться, что обновление было успешным, и поэтому мне хотелось сделать сравнение строк по каждой таблице , до и после обновления. – Thiru

+0

@Thiru: см. Мое обновление ниже – hobodave

ответ

4

Обновлено

При использовании InnoDB на только точный подсчет строк в всей таблице COUNT (*). Поскольку ваше обновление с 4.0 до 5.0 будет происходить только один раз, вам просто придется иметь дело со скоростью.

+0

Спасибо hobodave. Поскольку я только что ответил на ваш комментарий выше, я хотел бы сделать проверку работоспособности до и после миграции, и поэтому я не могу пойти на отдельный подход к таблице, в данном случае. – Thiru

-2

Ну, используя *, определенно не оптимальный, но как насчет только 1 колонки. Обычно я использую столбец id для подсчета количества строк.

+0

в MySQL, конкретный столбец не нужен, как вы можете: select count (1) from my_table –

+0

Спасибо Knix и Caughlan. Поскольку мои таблицы innodb огромны, счет (1) также занимает много времени. Интересно, ускорит ли подсчет всех индексов на таблицах innodb счет (1). – Thiru

+0

Тогда я думаю, что лучше всего держать счетчик в другой таблице всякий раз, когда строка вставлена ​​или удалена. Это вариант для вас? –

1

Это относится ко всем версиям MySQL. Как отмечали другие комментаторы, в InnoDB нет быстрого SELECT COUNT (*). Частично это объясняется тем, что InnoDB является многопрофильным, и он будет зависеть от контекста вашей транзакции, сколько строк должно быть в таблице.

Есть некоторые обходные пути:

1) Если вы не удалить, SELECT MAX (ID) должен возвращать правильное число строк.

2) Вместо того, чтобы удалять строки, вы можете архивировать их в таблицу удаленных строк (многие люди, похоже, хотят сохранить все в наши дни). Предполагая, что удаление является намного меньшим подмножеством неподвижного тока, вы можете вычесть count (*) из deleted_rows из SELECT max (id) из not_deleted.

3) Используйте триггеры. Это отстой для производительности.

Там довольно техническая дискуссия по этой проблеме здесь: http://mysqlha.blogspot.com/2009/08/fast-count-for-innodb.html

2

Подождите! Быстро! Используйте триггер и мета-таблицу ..

CREATE TABLE meta (
`name` char(32) NOT NULL , 
`value_int` int , 
unique (name) 
) ENGINE = INNODB; 
insert into meta (name, value_int) values ('mytable.count', 0); 

затем

set delimiter | 

CREATE TRIGGER mytablecountinsert AFTER INSERT ON mytable 
    FOR EACH ROW BEGIN 
     update meta set value_int=value_int+1 where name='mytable.count'; 
    END; 
| 

CREATE TRIGGER mytablecountdelete AFTER DELETE ON mytable 
    FOR EACH ROW BEGIN 
     update meta set value_int=value_int-1 where name='mytable.count'; 
    END; 
| 
Смежные вопросы