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

时间:2018-01-15 09:43:11

标签: php mysql sql

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

SELECT COUNT(DISTINCT id) FROM tablename WHERE shippable = '1'

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

SELECT count(rowsss) FROM (SELECT count(*) as rowsss FROM tablename WHERE shippable = '1' GROUP BY id) as T

这是我在启动mysql查询

之前使用EXPLAIN关键字时的输出

enter image description here

2 个答案:

答案 0 :(得分:6)

如果您需要过滤器,可以使用可发送的索引,例如:

 create index shippable_ixd on tablename (shippable);

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

根据您还需要列id的事实,您也可以尝试使用复合索引

 create index shippable_ixd on tablename (shippable, id);

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

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

答案 1 :(得分:0)

当你检查任何条件时,两个值都应该在同一类型中,那么执行查询的速度会很快。

SELECT count(rowsss) FROM (SELECT count(*) as rowsss FROM tablename WHERE CAST(shippable  AS CHAR) = '1' GROUP BY id) as T