如果字段值不明显,如何优化MySQL查询

时间:2017-02-03 13:20:17

标签: mysql indexing

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

Select * from mytable where balance > 0.02

如果表格有1mil +行,则查询将花费很长时间,因为BTree索引没有一组不同的余额值。

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

2 个答案:

答案 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类型时,此方法才有效。