表有大约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关键字时的输出
如果你需要一个过滤器,你可以使用可发运的索引,例如:
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经常用于数据库查询调优.