1

我在Mamp上有一个本地数据库,用于性能测试。我的问题表有大约500 万行。

这是我遇到的问题的表:

 1  User_ID     int(11)                                     
 2  Skill_ID    int(11)                                         
 3  Matching    int(11)                                         
 4  Grade       int(11)     

索引是 User_ID 和 Skill_ID。

这是我使用的查询:

  SELECT User_ID,COUNT(Matching),SUM(Matching)
   FROM Matching
   WHERE Skill_ID = 3 OR Skill_ID 5 OR Skill_ID = 18 ............
   GROUP BY User_ID
   ORDER BY SUM(Matching) DESC

我在我的测试站点上选择的技能越多,我的查询就越耗时。目前需要大约。第一个技能需要1 秒,然后加注大约 1 秒。每个选定技能 0.25 秒。所以对于 5 项技能,我已经需要超过 2 秒的时间。

我已经在 MySQL 的 my.cnf 中创建了索引并尝试了许多不同的修改(增加 key_buffer_size,启用 query_cache,sort_buffer_size......)

WAMP 在我的 Mac Book AIR 2012、4GB RAM、1,8 GHz 双核 Intel Core i5 Prozessor 上运行。

该表是 MyISAM。我无法避免 ORDER BY 和 COUNT 和 SUM 函数,它们对于查询来说太重要了。

该表估计将增长到超过 5000 万个条目。

编辑: 这是 EXPLAIN 命令的结果

  • 编号 1
  • 选择类型简单
  • 表匹配
  • 输入所有
  • 可能的键 NULL
  • 键空
  • key_len 空
  • 参考空
  • 行 5285936
  • 额外使用where;使用临时;使用文件排序

我怎样才能提高我的数据库的性能?我只需要更好的硬件吗?提前致谢!

编辑: 现在与分区相同的表

Create table Matching2 (User_ID int,Skill_ID int,Matching int,Note int)
Partition by Range (Skill_ID) (
Partition S0 VALUES LESS THAN (10),
Partition S1 VALUES LESS THAN (20),
Partition S2 VALUES LESS THAN (30),
Partition S3 VALUES LESS THAN (40),
Partition S4 VALUES LESS THAN (50),
Partition S5 VALUES LESS THAN (60),
Partition S6 VALUES LESS THAN (70),
Partition S7 VALUES LESS THAN (80)
);  

--> 没有显着的性能提升!

4

3 回答 3

1

实际上,您所能做的就是为查询添加覆盖索引,即您需要添加复合索引(Skill_Id,User_Id,Matching),并将您的WHERE条件更改为'Skill_Id IN(3,5,18)' .

于 2013-03-08T19:27:40.217 回答
0

如果您认为在接下来的几个月中该数据将增长到 5000 万,并且您已完成索引优化,我会建议对该表进行分区。

您可以查看http://dev.mysql.com/doc/refman/5.5/en/partitioning-overview.html

从链接引用

由于满足给定 WHERE 子句的数据只能存储在一个或多个分区上,因此可以大大优化某些查询,这会自动从搜索中排除任何剩余的分区。

于 2013-03-08T17:15:26.707 回答
0

有一个非常强大但不太为人所知的技巧。试试这个以确保使用 Skill_ID 索引:

SELECT User_ID,COUNT(Matching),SUM(Matching)
FROM Matching
inner join (           select 3 as sid
             union all select 5 as sid
             union all select 18 as sid
           ) skills
on skills.sid = Matching.Skill_ID
GROUP BY User_ID
ORDER BY SUM(Matching) DESC
于 2013-12-31T03:32:48.213 回答