производительность подсчета MySQL - PullRequest
4 голосов
/ 02 февраля 2011
select count(*) from mytable;
select count(table_id) from mytable; //table_id is the primary_key

оба запроса выполнялись медленно в таблице с 10 миллионами строк.Я задаюсь вопросом, почему, поскольку MySQL не может легко поддерживать счетчик, который обновляется, для всех операций вставки, обновления и удаления?
и есть ли способ улучшить этот запрос?Я использовал объяснение, но не сильно помог.

Ответы [ 2 ]

7 голосов
/ 02 февраля 2011

взгляните на следующие сообщения в блоге:

1) COUNT (***) против COUNT (столбец)
2) Easy MySQL Performance Tips
3) Быстрый подсчет (*) для InnoDB

Кстати, какой двигатель вы используете?

РЕДАКТИРОВАНИЕ: О технике ускорения счета, когда вам нужно просто знать, есть ли количество строк.Извините, просто не так с моим запросом.Таким образом, когда вам нужно просто знать, если, например, имеется 300 строк по конкретному условию, вы можете попробовать подзапрос:

select count(*) FROM
( select 1 FROM _table_ WHERE _conditions_ LIMIT 300 ) AS result

сначала вы минимизируете набор результатов, а затем подсчитываете результат;он все равно будет сканировать набор результатов, но вы можете ограничить его (еще раз, он работает, когда вопрос к БД «здесь больше или меньше 300 строк), и если БД содержит более 300 строк, которые удовлетворяют условию, что запрос выполняется быстрее

Результаты тестирования (в моей таблице 6,7 млн ​​строк):

1) SELECT count(*) FROM _table_ WHERE START_DATE > '2011-02-01'
возвращает 4,2 млн в течение 65,4 секунд

2) SELECT count(*) FROM ( select 1 FROM _table_ WHERE START_DATE > '2011-02-01' LIMIT 100 ) AS result
возвращает 100 за 0,03 секунды

Ниже приведен результат запроса объяснения, чтобы увидеть, что там происходит:

EXPLAIN SELECT count(*) FROM ( select 1 FROM _table_ WHERE START_DATE > '2011-02-01' LIMIT 100 ) AS result

enter image description here

4 голосов
/ 02 февраля 2011

Как отметил cherouvim в комментариях, это зависит от механизма хранения.

MyISAM ведет подсчет строк таблицы и может поддерживать его точность, поскольку единственными блокировками, поддерживаемыми MyISAM, является таблицаlock.

InnoDB, однако поддерживает транзакции и должен выполнить сканирование таблицы для подсчета строк.

http://www.mysqlperformanceblog.com/2006/12/01/count-for-innodb-tables/

...