对大型数据库进行mysql优化

时间:2010-12-23 10:56:39

标签: mysql database

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:1)

要开始:load test并启用MySQL slow query log

其他一些建议:

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

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

  1. usrid and status
  2. 身份和头衔
  3. 状态和说明(这是一个可转位字段吗?)
  4. 关于索引的另一个注释creating a covering index,即包含所有列的索引,如果您的一个频繁访问模式是通过主键检索,也可以是一个有用的解决方案。

答案 1 :(得分:0)

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

http://memcached.org/