大家可以使用COUNT(*)函数来获取数据总数,但是这样会导致MySQL进行全表扫描,耗费大量的资源。为了避免这种情况,大家可以使用EXPLAIN关键字来查看执行计划:
EXPLAIN SELECT COUNT(*) FROM table_name;
执行上述SQL语句后,大家可以看到MySQL的执行计划。
+----+-------------+-----------+------+---------------+------+---------+------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-----------+------+---------------+------+---------+------+------+-------------+ | 1 | SIMPLE | table_name| ALL | NULL | NULL | NULL | NULL | 1000 | Using where;| +----+-------------+-----------+------+---------------+------+---------+------+------+-------------+
其中,id列表示每个SELECT查询的顺序,1表示第一个查询;select_type列表示SELECT查询的类型,SIMPLE表示不包含UNION或子查询;table列表示查询的表名;type列表示MySQL在查询时使用了什么类型的索引,ALL表示没有使用索引;key列表示MySQL在查询时使用的索引名称;rows列表示MySQL预计要扫描的行数;Extra列包含了其他的一些信息,如是否使用了临时表、是否使用了文件排序等。
从上述执行计划中,大家可以看到MySQL没有使用索引,需要扫描全部的1000行数据。为了加速查询速度,大家可以添加一个索引:
ALTER TABLE table_name ADD INDEX `index_name` (`column_name`);
之后,大家再执行获取数据总数的SQL语句,再次查看执行计划:
EXPLAIN SELECT COUNT(*) FROM table_name;
此时,大家可以看到MySQL的执行计划已经发生了变化:
+----+-------------+-----------+-------+---------------+------------+---------+------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-----------+-------+---------------+------------+---------+------+------+-------------+ | 1 | SIMPLE | table_name| index | NULL | `index_name`| 4 | NULL | 1000 | | +----+-------------+-----------+-------+---------------+------------+---------+------+------+-------------+
这次,MySQL使用了索引,只需要扫描全部的1000行数据就可以获取数据总数,从而大大提高了查询速度和减少了资源消耗。