首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当字段值不是唯一时如何优化MySQL查询

问当字段值不是唯一时如何优化MySQL查询
EN

Stack Overflow用户
提问于 2017-02-03 21:20:17
回答 2查看 53关注 0票数 3

假设我有一个MySQL表,其中有一个名为balance的索引字段。但是,该表包含95%的balance = 0行。所以如果我要去:

代码语言:javascript
复制
Select * from mytable where balance > 0.02

如果表中有1mil+行,查询将会花费相当长的时间,因为BTree索引没有一组不同的balance值。

在这种情况下,如果不更改数据,如何优化SQL查询

EN

回答 2

Stack Overflow用户

发布于 2017-02-03 21:26:46

首先,您的查询可能会返回很多行。这需要时间。

如果只需要几个,可以添加limit

代码语言:javascript
复制
Select *
from mytable
where balance > 0.02
limit 100;

其次,如果您有任何特别大的列,那么这些列可能会支配返回行的时间。如果这是一个问题,那么只选择您真正需要的列。

第三,索引可能会有所帮助。如果只有很少的行满足where子句,那么balance上的索引应该可以加快查询速度。但是,如果有很多行符合过滤条件,那么您将返回大量数据--这可能需要时间。

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

票数 3
EN

Stack Overflow用户

发布于 2017-02-03 21:35:52

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

编辑:由于某些原因,MySQL分区被限制为整数值,也许这个变通方法可以工作:

代码语言:javascript
复制
ALTER TABLE mytable
PARTITION BY RANGE( CEILING(balance) ) (
    PARTITION p0 VALUES LESS THAN (1),
    PARTITION p1 VALUES LESS THAN MAXVALUE
); 

注意:只有当balance声明为Decimal类型,而不是Float类型时,此方法才有效。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42025298

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档