我在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)
);
--> 没有显着的性能提升!