字段值不明确时如何优化MySQL查询

字段值不明确时如何优化MySQL查询,mysql,indexing,Mysql,Indexing,假设我有一个MySQL表,带有一个名为balance的索引字段。但是,该表包含余额为0的行的95%。因此,如果我要去: Select * from mytable where balance > 0.02 如果表中有1mil+行,那么查询将花费相当长的时间,因为BTree索引没有一组不同的平衡值 在这种情况下,在不更改数据的情况下,如何优化SQL查询首先,您的查询可能会返回很多行。这需要时间 如果您只需要少量,可以添加限制: Select * from mytable where bal

假设我有一个MySQL表,带有一个名为balance的索引字段。但是,该表包含余额为0的行的95%。因此,如果我要去:

Select * from mytable where balance > 0.02
如果表中有1mil+行,那么查询将花费相当长的时间,因为BTree索引没有一组不同的平衡值


在这种情况下,在不更改数据的情况下,如何优化SQL查询首先,您的查询可能会返回很多行。这需要时间

如果您只需要少量,可以添加
限制

Select *
from mytable
where balance > 0.02
limit 100;
其次,如果您有任何特别大的列,那么这些列可能会支配返回行的时间。如果这是一个问题,那么只选择您真正需要的列

第三,索引可能会有所帮助。如果只有很少的行满足
where
子句,那么
balance
上的索引将加快查询速度。但是,如果有很多行与筛选条件匹配,那么您将返回大量数据——这可能需要时间


此外,这假设一个名为
mytable
的东西实际上是一个表。如果它是一个视图,那么所有的赌注都没有了。您需要优化视图,而不是查询。

这是一种激进的方法,但如果此查询非常关键,您可以在余额字段的表中添加一个分区:

编辑:由于某些原因,MySQL分区被限制为INT值,也许这个解决方法可以:

ALTER TABLE mytable
PARTITION BY RANGE( CEILING(balance) ) (
    PARTITION p0 VALUES LESS THAN (1),
    PARTITION p1 VALUES LESS THAN MAXVALUE
); 

注意:这种方法只有在balance被声明为十进制类型而不是浮点类型时才有效。

您尝试过吗?我的猜测是,不管值是多少,它都很快。我在类似的表上尝试过,该表只有两行balance>0。在1mil行表上花了2秒(慢)您是否尝试过将balance设置为NULL,并且仅在0时设置值?这是一个好主意,但似乎没有帮助刚刚测试:1M中的10行在零时间内返回。因此,您需要向我们提供有关如何重现长运行时的更多信息。你甚至没有发布解释结果。谢谢,我都试过了。我认为这是缓慢的,因为95%的重复字段值没有给BTree索引太多的工作with@OoDee . . . 如果这真的很重要,您可以使该列成为聚集索引中的第一个键。
LIMIT 9999999
可能会诱使优化器使用
index(balance)
。我收到一个错误,说“VALUES value for partition”。。。“必须具有INT类型”