如何对大型MySQL表进行性能调整?

如何对大型MySQL表进行性能调整?,mysql,sql,database,performance,Mysql,Sql,Database,Performance,我有一个MySQL表MtgoxTrade(id、time、price、amount、type、tid)有超过5亿条记录,我需要从所有记录中查询三个字段(time、price、amount): SELECT time, price, amount FROM MtgoxTrade; 它在Win7上花费了110秒,这太慢了,我的问题是: 复合索引对此有帮助吗?请注意,我的SQL查询没有WHERE子句 可以进行任何其他优化来提高查询性能吗 更新:很抱歉MtgoxTrade表共有6个字段:(id、时间、

我有一个MySQL表
MtgoxTrade(id、time、price、amount、type、tid)
有超过5亿条记录,我需要从所有记录中查询三个字段(time、price、amount):

SELECT time, price, amount FROM MtgoxTrade;
它在Win7上花费了110秒,这太慢了,我的问题是:

  • 复合索引对此有帮助吗?请注意,我的SQL查询没有
    WHERE
    子句
  • 可以进行任何其他优化来提高查询性能吗

  • 更新:很抱歉MtgoxTrade表共有6个字段:(id、时间、价格、金额、类型、tid)。我的SQL只需要查询三个字段(时间、价格、金额)。我已经尝试在(时间、价格、金额)上添加复合索引,但似乎没有任何帮助。

    如果这是您真正的查询,则没有任何帮助。想一想吧——你要求交付整个500米以上桌子的内容!无论你做什么,它都会很慢-整个表都必须处理

    如果您可以将程序逻辑限制为只处理表中较小的子集,那么就有可能使其更快

    例如,您可以使用
    WHERE
    子句仅处理上月的结果:

    SELECT time, price, amount
    FROM MtgoxTrade
    WHERE time BETWEEN '2013-09-01' AND '2013-09-21'
    
    这可以非常快地工作,但您仍然需要在
    time
    字段中添加索引,如下所示:

    CREATE INDEX mtgoxtrade_time_idx ON mtgoxtrade (time);
    

    如果这是你真正的疑问-不,没有任何可能的帮助。想一想吧——你要求交付整个500米以上桌子的内容!无论你做什么,它都会很慢-整个表都必须处理

    如果您可以将程序逻辑限制为只处理表中较小的子集,那么就有可能使其更快

    例如,您可以使用
    WHERE
    子句仅处理上月的结果:

    SELECT time, price, amount
    FROM MtgoxTrade
    WHERE time BETWEEN '2013-09-01' AND '2013-09-21'
    
    这可以非常快地工作,但您仍然需要在
    time
    字段中添加索引,如下所示:

    CREATE INDEX mtgoxtrade_time_idx ON mtgoxtrade (time);
    

    试试这个,
    ALTER TABLE MtgoxTrade INDEX(time,price,amount)
    显示您的表结构。在110秒内检索5亿行听起来并不坏。真正的问题是:为什么需要从表中检索所有行?我很确定没有用户会浏览完整的结果。我已经添加了索引(时间、价格、金额),但似乎没有任何帮助。“MtgoxTrade只有字段(id、时间、价格、金额)”-那么为什么您问题中的表突然又有两列?试试这个,
    ALTER table MtgoxTrade INDEX(时间、价格、金额)
    显示您的表结构。在110秒内检索5亿行听起来并不糟糕。真正的问题是:为什么需要从表中检索所有行?我很确定没有用户会浏览完整的结果。我已经添加了索引(时间、价格、金额),但似乎没有帮助。“MtgoxTrade只有字段(id、时间、价格、金额)”-那么,为什么您问题中的表突然又多了两列?@usr:如果定义了主键,它将是一个包含所有行的聚集索引。该索引与包含所有三个选定列的复合索引仅在
    id
    列上有所不同。因此,我怀疑三个选定列的索引是否会产生很大的差异(尽管你是对的,这是可能的)。我假设他没有选择其他列,但我现在注意到没有任何列。那样的话,你的答案是正确的+1该表共有6个字段,我只查询了3个字段。我不在乎字段的顺序。@usr:现在表突然有了更多的列。。。。在这种情况下,索引可能有助于减少要读取的总数据量。除了3列索引(这可能会有所帮助)之外,下一步要检查的是您的硬件。拥有更多的RAM和更快的磁盘(如SSD)会有所帮助。@usr:如果定义了主键,它将是一个包含所有行的聚集索引。该索引与包含所有三个选定列的复合索引仅在
    id
    列上有所不同。因此,我怀疑三个选定列的索引是否会产生很大的差异(尽管你是对的,这是可能的)。我假设他没有选择其他列,但我现在注意到没有任何列。那样的话,你的答案是正确的+1该表共有6个字段,我只查询了3个字段。我不在乎字段的顺序。@usr:现在表突然有了更多的列。。。。在这种情况下,索引可能有助于减少要读取的总数据量。除了3列索引(这可能会有所帮助)之外,下一步要检查的是您的硬件。拥有更多的RAM和更快的磁盘(如SSD)会有所帮助。