【问题标题】:mysql optimization for a large database大型数据库的mysql优化
【发布时间】:2010-12-23 22:50:36
【问题描述】:

我正在使用 PHP 和 MYSQL(MYISAM) 创建一个电子商务网络应用程序。我想知道如何加快查询速度

我有一个包含以下列的超过一百万条记录的产品表:id (int, primary) catid(int) usrid (int) title (int) description (int) status (enum) date(datetime)

最近我根据产品类别(catid)将这个表拆分为多个表。认为它可能会减少服务器上的负载。

现在我需要从这些表中获取结果并结合以下条件集 1. 匹配 usrid 和状态的结果。 (获取用户产品)2 个匹配状态和标题或描述的结果(例如:用于产品搜索)

现在我必须使用 UNION 从这些组合的所有表中获取结果,这会减慢性能,我也不能将 LIMIT 应用于组合结果集。我想在所有这些列上创建一个索引以加快搜索速度,但这可能会减慢 INSERTS 和 UPDATES。我也开始认为拆分桌子一开始就不是一个好主意。

我想知道在这种情况下优化数据检索的最佳方法。我也对新的数据库架构提案持开放态度。

【问题讨论】:

  • 您能给我们提供一个示例数据库布局吗?另外,您是否考虑过使用JOIN
  • 如果您概述了当前数据库架构以及相关的表和键,将会很有帮助。对于具有数百万条记录的表,我建议根本不要将它们 UNION-ing 或 JOIN-ing 到其他表,而是对表执行单个查询并让脚本组合您的结果。
  • 如果我想一起搜索所有表格,@bobby join 不会在这里给出我想要的结果。
  • @oli 将结果与脚本结合起来是我脑海中闪过的一个想法,这将是我最后的选择。特别是因为无法对 UNION 查询应用限制。

标签: mysql database


【解决方案1】:

开始:load test 并打开MySQL slow query log

其他一些建议:

如果每个类别使用单独的表格,请使用 UNION ALL 而不是 UNION。原因是 UNION 意味着独特性,这使得数据库引擎做额外的工作来不必要地删除行。

索引确实会增加写入惩罚,但您所描述的可能具有至少 10 比 1 的读写比率,并且可能更像 1000 比 1 或更高。所以索引。对于您描述的两个查询,我可能会创建三个索引(您需要研究解释计划以确定哪种列顺序更好)。

  1. 用户名和状态
  2. 状态和标题
  3. 状态和描述(这是一个可索引的字段吗?)

另一个关于索引的注释creating a covering index,它包含所有列,如果您的频繁访问模式之一是通过主键检索,那么它也可能是一个有用的解决方案。

【讨论】:

    【解决方案2】:

    您是否考虑过使用 memcached?它在服务器上缓存来自数据库查询的结果集,并在多个用户请求时返回它们。如果它没有找到缓存结果集,那么它才会查询数据库。它应该会显着减轻数据库的负载。

    http://memcached.org/

    【讨论】:

    • 我观察到 mysql 固有地为查询提供了缓存机制。但我正在从查询和架构设计的角度寻找优化。
    猜你喜欢
    • 2011-02-28
    • 2012-03-02
    • 1970-01-01
    • 1970-01-01
    • 2012-07-20
    • 2010-12-12
    • 1970-01-01
    • 2019-12-02
    • 2012-01-31
    相关资源
    最近更新 更多