Returns a count of the number of non-NULL
values of expr
in the rows retrieved by a SELECT
statement. The result is a BIGINT
value.
COUNT(*)
is somewhat different in that it returns a count of the number of rows retrieved, whether or not they contain NULL
values.
For transactional storage engines such as InnoDB
, storing an exact row count is problematic. Multiple transactions may be occurring at the same time, each of which may affect the count.
InnoDB
does not keep an internal count of rows in a table because concurrent transactions might “see” different numbers of rows at the same time. Consequently, SELECT COUNT(*)
statements only count rows visible to the current transaction.
As of MySQL 8.0.13, SELECT COUNT(*) FROM <em class="replaceable"><code>tbl_name</code></em>
query performance for InnoDB
tables is optimized for single-threaded workloads if there are no extra clauses such as WHERE
or GROUP BY
.
InnoDB
processes SELECT COUNT(*)
statements by traversing the smallest available secondary index unless an index or optimizer hint directs the optimizer to use a different index. If a secondary index is not present, InnoDB
processes SELECT COUNT(*)
statements by scanning the clustered index.
Processing SELECT COUNT(*)
statements takes some time if index records are not entirely in the buffer pool. For a faster count, create a counter table and let your application update it according to the inserts and deletes it does. However, this method may not scale well in situations where thousands of concurrent transactions are initiating updates to the same counter table. If an approximate row count is sufficient, use SHOW TABLE STATUS
.
InnoDB
handles SELECT COUNT(*)
and SELECT COUNT(1)
operations in the same way. There is no performance difference.
For MyISAM
tables, COUNT(*)
is optimized to return very quickly if the SELECT
retrieves from one table, no other columns are retrieved, and there is no WHERE
clause. For example:
This optimization only applies to MyISAM
tables, because an exact row count is stored for this storage engine and can be accessed very quickly. COUNT(1)
is only subject to the same optimization if the first column is defined as NOT NULL
.
Original: https://www.cnblogs.com/rsapaper/p/16527204.html
Author: rsapaper_ing
Title: InnoDB handles SELECT COUNT(*) and SELECT COUNT(1) operations in the same way. There is no performance difference.
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/546120/
转载文章受原作者版权保护。转载请注明原作者出处!