我有一个大约 30gb 数据的 MySQL 数据库。一些表包含超过 4000 万行。我正在使用 InnoDB。我在本地 PC 中仅使用“select count(*) from table_name”进行查询大约需要 5 分钟。我想我不可能加入这个表。我想问一下我能做些什么来提高性能。还是我需要切换到另一个数据库?我从来没有在数据库中遇到过这么大的数据。请帮忙。
问问题
1577 次
3 回答
4
我已经运行了超过 1 亿个条目的 mysql 实例,并且每天提供超过 3000 万个查询。所以可以做到。
如果类似配置,任何其他数据库系统都会出现您遇到的问题。
我只能给您一些提示,如果这是关键任务,请考虑聘请专业人士来调整您的系统。
您需要查看的基础知识;
- 这种大小的数据库最好在具有 SSD 磁盘且至少 2 个内核的专用服务器上运行;
- 您的服务器将需要大量 RAM,至少您的总数据库大小 + 20% 用于其他系统资源;
- 确保 mysql 已配置足够的内存,占总 RAM 的 80%。执行此操作的主要设置是
innodb_buffer_pool_size
; - 优化你的查询,并在需要的地方建立索引——这是一门艺术,但可以极大地提高性能,学会
EXPLAIN ...
在你的查询上使用。
于 2015-11-11T03:53:14.887 回答
0
MySQL InnoDB 表不保留行数,因此SELECT COUNT(*)
可能很慢。这并不表示其他查询可能如何执行,但它表示全表扫描可能有多慢。5 分钟对于 4000 万行来说真的很糟糕,并且可能表明您的数据库或磁盘存在严重问题。
这是有关该主题的性能博客。另请参阅此相关答案。
于 2015-11-11T03:50:25.960 回答
0
我之前遇到过大日期大小的问题,希望我的经验对你有用。
首先,您需要为您的表创建索引,但应该使用哪种索引取决于您的查询逻辑。
建立索引后,如果查询仍然很慢,最好将数据划分为层次结构,例如源表、中间表和报表表。报表表只存储一些最终数据,查询速度很快,还为它创建索引。
第三,如果上面提到的不能满足您的要求,请尝试使用 memsql 之类的东西。
此外,学习一些命令,如:
set profiling = 1
do some slow query
show profiles;
SHOW PROFILE FOR QUERY N;
于 2015-11-11T04:00:00.360 回答