我在 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秒为第一项技能并且加注到ca.每个选定技能 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双核英特尔酷睿i5 Prozessor上运行。
该表是MyISAM。我无法避免使用ORDER BY和COUNT和SUM函数,它们对查询来说太重要了。
该表估计会增加到超过5000万条。
修改 这是EXPLAIN命令的结果
如何提高数据库的性能?我只需要更好的硬件吗? 提前致谢!
修改 现在与分区相同
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)
);
- >没有明显的性能提升!
答案 0 :(得分:1)
实际上,您所能做的就是为查询添加覆盖索引,即您需要添加复合索引(Skill_Id,User_Id,Matching),并将您的WHERE条件更改为'Skill_Id IN(3,5, 18)”。
答案 1 :(得分:0)
如果您认为这些数据在未来几个月内会增长到5000万,并且您已完成索引优化,我建议您为此表进行分区。
您可以查看http://dev.mysql.com/doc/refman/5.5/en/partitioning-overview.html
从链接引用
由于数据的存在,一些查询可以大大优化 满足给定的WHERE子句只能存储在一个或多个上 分区,自动排除任何剩余的分区 来自搜索。
答案 2 :(得分: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