在mysql中使用WHERE子句时count()需要很多时间

Sum*_*mit 1 php mysql sql

表有大约100 000条记录(元组).没有where子句它只需要几毫秒,而使用where子句需要4-5秒.

SELECT COUNT(DISTINCT id) FROM tablename WHERE shippable = '1'
Run Code Online (Sandbox Code Playgroud)

我也试过这个,但与前一个相比需要更多的时间.

SELECT count(rowsss) FROM (SELECT count(*) as rowsss FROM tablename WHERE shippable = '1' GROUP BY id) as T
Run Code Online (Sandbox Code Playgroud)

这是我在启动mysql查询之前使用EXPLAIN关键字时的输出

在此输入图像描述

sca*_*dge 6

如果你需要一个过滤器,你可以使用可发运的索引,例如:

 create index shippable_ixd on tablename (shippable);
Run Code Online (Sandbox Code Playgroud)

以这种方式,对表的扫描仅限于匹配并避免扫描整个表的值

并且基于您还需要列的事实,您也id可以尝试使用复合索引

 create index shippable_ixd on tablename (shippable, id);
Run Code Online (Sandbox Code Playgroud)

sqloptimizer应直接从索引中检索所需的信息.

在这种情况下,使用复合索引(具有不需要where子句的冗余id)非常有用,因为SQL引擎只需扫描索引就可以检索查询所需的所有数据,从而避免访问表中的数据.此tecnique经常用于数据库查询调优.