假设我有一个MySQL表,其中有一个名为balance的索引字段。但是,该表包含95%的balance = 0行。所以如果我要去:
Select * from mytable where balance > 0.02如果表中有1mil+行,查询将会花费相当长的时间,因为BTree索引没有一组不同的balance值。
在这种情况下,如果不更改数据,如何优化SQL查询
发布于 2017-02-03 21:26:46
首先,您的查询可能会返回很多行。这需要时间。
如果只需要几个,可以添加limit
Select *
from mytable
where balance > 0.02
limit 100;其次,如果您有任何特别大的列,那么这些列可能会支配返回行的时间。如果这是一个问题,那么只选择您真正需要的列。
第三,索引可能会有所帮助。如果只有很少的行满足where子句,那么balance上的索引应该可以加快查询速度。但是,如果有很多行符合过滤条件,那么您将返回大量数据--这可能需要时间。
此外,这还假设名为mytable的东西实际上是一个表。如果它是一个视图,那么所有的赌注都是无效的。您需要优化视图,而不是查询。
发布于 2017-02-03 21:35:52
这是一种激进的方法,但如果此查询非常关键,则可以在balance字段中为表添加一个分区:
编辑:由于某些原因,MySQL分区被限制为整数值,也许这个变通方法可以工作:
ALTER TABLE mytable
PARTITION BY RANGE( CEILING(balance) ) (
PARTITION p0 VALUES LESS THAN (1),
PARTITION p1 VALUES LESS THAN MAXVALUE
); 注意:只有当balance声明为Decimal类型,而不是Float类型时,此方法才有效。
https://stackoverflow.com/questions/42025298
复制相似问题