表有大约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关键字时的输出答案 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