假设我有一个MySQL表,其中包含一个名为balance的索引字段。但是,该表包含95%的行,其余为= 0.所以如果我要去:
Select * from mytable where balance > 0.02
如果表格有1mil +行,则查询将花费很长时间,因为BTree索引没有一组不同的余额值。
在这种情况下,如果不更改数据,将如何优化SQL查询
答案 0 :(得分:3)
首先,您的查询可能会返回很多行。这需要时间。
如果您只需要几个,可以添加limit
:
Select *
from mytable
where balance > 0.02
limit 100;
其次,如果你有任何特别大的列,那么那些可能会占据返回行的时间。如果这是一个问题,那么只选择您真正需要的列。
第三,索引可能有所帮助。如果很少的行满足where
子句,则balance
上的索引应该加快查询速度。但是,如果很多行与过滤条件匹配,那么您将返回大量数据 - 这可能需要一些时间。
此外,这假设称为mytable
的东西确实是一个表。如果它是一个视图,那么所有的赌注都是关闭的。您需要优化视图而不是查询。
答案 1 :(得分:2)
这是一种激进的方法,但如果此查询非常关键,您可以在余额字段中向表中添加分区:
编辑:由于某种原因,MySQL分区仅限于INT值,这种解决方法可能会起作用:
// CarRepository.cs
public class CarRepository : IVehicleRepository
{
private static ConcurrentDictionary<string, Car> _cars =
new ConcurrentDictionary<string, Car>();
public CarRepository()
{
Add(new Car { seats = 5 });
}
public IEnumerable<Car> GetAll()
{
return _cars.Values;
}
// ... I implemented the other methods here
}
注意:只有将balance声明为Decimal类型而不是Float类型时,此方法才有效。