Mysql производительность и количество (*) - PullRequest
1 голос
/ 06 октября 2009

Я хочу знать, что мой sql выполняет количество запросов в линейное время или в журнале (n) времени, я думаю, что, если параметр запроса был проиндексирован, он может сделать это путем кубизации

Ответы [ 3 ]

1 голос
/ 06 октября 2009

Ответ на это сложный. Это зависит не только от количества используемых таблиц, но также от того, какой механизм хранения вы используете.

Сказав это, это то, что говорится в руководстве:

COUNT (*) оптимизирован для возврата очень быстро, если SELECT извлекает из одна таблица, другие столбцы отсутствуют извлекается, а ГДЕ нет пункт. Например:

mysql> ВЫБЕРИТЕ СЧЕТ (*) ОТ студента;

Эта оптимизация применяется только к Только таблицы MyISAM, потому что точный количество строк хранится для этого хранилища двигатель и может быть доступен очень быстро. Для транзакционного хранения двигатели, такие как InnoDB, хранящие точное количество строк более проблематично потому что несколько транзакций могут быть происходит, каждый из которых может повлиять количество.

- MySQL Manual

1 голос
/ 06 октября 2009
  • MyISAM вернется немедленно.
  • InnoDB будет выполнять сканирование PK, поэтому время будет линейно увеличиваться с увеличением количества записей.

Если вам нужно посмотреть, сколько записей содержит таблица InnoDB, самый быстрый способ - использовать

EXPLAIN select * from student;

(но статистика innodb может быть неправильной, поэтому ошибка 40% также возможна)

1 голос
/ 06 октября 2009

Все зависит от запроса или, точнее, от плана запроса, который MySql в конечном итоге выберет для обработки запроса.

Кроме того, все зависит от того, что мы подразумеваем под 'n', в этих больших выражениях O. Например, если 'n' - это значение счетчика, которое в конечном итоге вернулось, и если это значение соответствует счетчику, произведенному запросом, который требует многократного сканирования нескольких таблиц, сложность может быть хуже, чем линейная.

...