2010-12-23 44 views
1

我使用PHP和MYSQL(MYISAM)创建电子商务Web应用程序。我想知道如何加快我的查询针对大型数据库的mysql优化

我有一个超过一百万记录与以下列的产品表:id(int,primary)catid(int)usrid(int)title(int)description(int)状态(枚举)日期(日期时间)

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

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

现在我必须使用UNION从这些所有表中取得结果,这会降低表达的风险也不会将LIMIT应用于组合结果集。我想在所有这些列上创建一个索引来加速搜索,但这可能会降低插入和更新的速度。同样,我正在认为分裂桌子并不是一个好主意。

我想知道在这种情况下优化数据检索的最佳方法。我也接受新的数据库模式提案。

+0

你能否给我们提供一个示例Database-Layout?另外,你是否考虑使用`JOIN`? – Bobby 2010-12-23 10:58:39

+0

如果您使用相关的表和关键字概述了当前的数据库模式,那将会很有帮助。 对于拥有数百万条记录的表,我建议不要联合或将它们联接到其他表中,而是在表上进行单个查询并让脚本组合您的结果。 – Oli 2010-12-23 11:00:33

回答

1

要启动:load test并打开MySQL slow query log

其他一些建议:

如果每个类别的单独的表呆在使用UNION ALL代替UNION。 UNION的原因意味着独特性,这使得数据库引擎做了额外的工作来不必要地重复数据删除行。

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

  1. usrid和状态
  2. 地位和头衔
  3. 状态和描述(这是一个可转位场?)

对指数的另一个音符,creating a covering index,这是一个有你的所有列,如果您的某个频繁访问模式是通过主键进行检索的话,也可以成为一种有用的解决方案。

0

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

http://memcached.org/