代码之家  ›  专栏  ›  技术社区  ›  sam

PHP和MySQL:优化数据库

  •  3
  • sam  · 技术社区  · 16 年前

    我有一个超过10000000行的数据库。现在查询它只需要几秒钟就可以找到一些基本信息。这并不可取,我知道优化的最佳方法是尽可能减少行数,但现在我没有时间这样做。

    最简单的优化方法是什么 MySQL 数据库,以便在查询它时,所花费的时间很短?

    我不在乎数据库的大小,这并不重要,所以任何增加数据库大小的优化都是可以的。我不是很擅长优化,现在我已经建立了索引,但我不知道我可以从那里得到多少更好的。

    我最终会适当地精简数据库,但有没有一个快速的临时解决方案?

    6 回复  |  直到 13 年前
        1
  •  2
  •   Community Mohan Dere    9 年前

    除了已经建议的索引之外,如果分区表很大,您可能还需要查看分区表。

    Partitioning in MySQL

    这里很难具体说明,因为我们的信息非常有限,但是适当的索引和分区可以走很长的路。正确地编制索引可能是一个很长的主题,但在非常普遍的意义上,您需要为查询的列编制索引。

    例如,假设您有一个员工表,并且您有SSN、FNAME、LNAME等常用列。除了这些列之外,我们还要说表中还有10列。

    现在您有了这个查询:

    SELECT FNAME, LNAME FROM EMPLOYEES WHERE SSN = 'blah';
    

    SSN 可能是这里的主键,并且可能已经有一个唯一的索引,通过创建另一个包含列的复合索引(SSN、FNAME、LNAME),您可能会看到性能优势。这是有益的,因为数据库只需查看复合索引即可满足此查询,因为它包含排序和压缩空间中所需的所有值(也就是说,更少的I/O)。即使仅SSN上的索引是执行完整表扫描的更好的访问方法,数据库仍必须读取索引(I/O)的数据块,找到包含满足查询所需记录指针的值,然后需要读取不同的数据块(读取:更多随机I/O),以便检索fname和lname的实际值。

    此处的一些其他链接可能会对您有所帮助:

        2
  •  2
  •   Peter Mortensen Pieter Jan Bonestroo    13 年前

    正如我看到的,您从数据库请求了40k行,这一数据负载需要时间才能传输。

    此外,永远不要问“总体上如何改进”。没有“通用”优化的方法。优化始终是对特定案例进行分析和研究的结果。

        3
  •  1
  •   Felix Kling    16 年前

        4
  •  1
  •   exiter2000    16 年前

    在您的示例“WHERE x=y”中,如果y是列名,则也使用y创建一个索引。

    此外,归档表也有帮助。我不知道如何做到这一点,主要是DBA任务。

        5
  •  1
  •   spronkey    16 年前

    如果要进行排序或复杂查询,可能需要使用多列索引。例如,如果您正在搜索x.name='y'或x.phone='z'的位置,那么在name,phone上放置索引可能是值得的。简单的例子,但如果你需要这样做,你还需要进一步研究:)

        6
  •  0
  •   jasonbar    16 年前