我将MEMORY Engine用于与特定 MYSQL 查询关联的所有表,因为访问速度对我的项目至关重要。
出于某种原因,我注意到仍然会发生大量磁盘写入。
这是因为 Windows 将 RAM 交换到磁盘吗?我怎样才能防止这种情况发生?
编辑:这是我的全局变量:
mysql> show global variables;
+---------------------------------------------------+--------------------------------------------------------------------------------
------------------------------+
| Variable_name | Value
|
+---------------------------------------------------+--------------------------------------------------------------------------------
------------------------------+
| auto_increment_increment | 1
|
| auto_increment_offset | 1
|
| autocommit | ON
|
| automatic_sp_privileges | ON
|
| back_log | 50
|
| basedir | C:/Program Files/MySQL/MySQL Server 5.5/
|
| big_tables | OFF
|
| binlog_cache_size | 32768
|
| binlog_direct_non_transactional_updates | OFF
|
| binlog_format | STATEMENT
|
| …Run Code Online (Sandbox Code Playgroud) 我正在运行一个 facebook 应用程序,目前有 300 - 600 个并发用户(并且还在增长)。为了让硬件为增长做好准备,我将 i7 / 12gb ram / 2x 80gb intel x25 ssd(debian 5.0 / mysql 5.0 / 64bit)更改为 bi-xeon / 24gb ram / 2x 120gb intel 320 ssd /mysql . 64 位)。
现在我面临的问题是性能比“小盒子”差。在两台服务器上,我一直在使用 nginx/php fcgi 来提供内容。
我只使用 innodb,读取/写入大约 65%/35%。大约 800 - 1000 qps,但所有查询都很简单,永远不会加入超过 1 个额外的表。所有索引都已设置,并且没有单独的查询记录在慢日志中(> 2 秒)。目前我有大约 400MB 的数据(大约 1GB 的索引)预计它每个月都会翻一番。
我很喜欢每个可以给我一个提示的人,他们应该改变什么才能让它运行得更顺畅。
i7盒子上的旧配置是这样的(混合myisam / innodb),在800+用户下表现相当不错。
旧的my.cnf
key_buffer = 3000M
max_allowed_packet = 128M
thread_stack = 192K
thread_cache_size = 8
max_connections = 400
table_cache = 8000
thread_concurrency …Run Code Online (Sandbox Code Playgroud) my.cnf(5.5 和 5.1 是一样的):
back_log=200
max_connections=512
max_connect_errors=999999
key_buffer=512M
max_allowed_packet=8M
table_cache=512
sort_buffer=8M
read_buffer_size=8M
thread_cache=8
thread_concurrency=4
myisam_sort_buffer_size=128M
interactive_timeout=28800
wait_timeout=7200
Run Code Online (Sandbox Code Playgroud)
mysql 5.5:
..mysql5.5/bin/mysqlslap -a --concurrency=10 --number-of-queries 5000
--iterations=5 -S /tmp/mysql_5.5.sock --engine=innodb
Benchmark
Running for engine innodb
Average number of seconds to run all queries: 15.156 seconds
Minimum number of seconds to run all queries: 15.031 seconds
Maximum number of seconds to run all queries: 15.296 seconds
Number of clients running queries: 10
Average number of queries per client: 500
Run Code Online (Sandbox Code Playgroud)
mysql5.1:
..mysql5.5/bin/mysqlslap -a --concurrency=10 …Run Code Online (Sandbox Code Playgroud) 我是一名学生,作为我的学术界的一部分,我正在开发几个项目。
在为其中一个项目开发数据库时,我们遇到了一种情况,我们考虑是否需要 ERD。目前,并不是我们每个人都同意先开发 ERD,然后从它开发数据库。
大多数人更喜欢直接根据纸上要求的系统口头开发数据库。
现在,我严格遵循数据库原则。我认为数据库应该只从 ERD 开发。所以,我只想知道以下几点:
每个月我们都会制作生产数据库的月末快照。这些月末快照严格用于报告目的,没有对其进行任何插入、更新或删除。这些快照中的每一个都有一个.MDF和.LDF文件。
我想删除.LDF文件并释放服务器上的一些空间。我需要保留.LDF文件有什么原因吗?
澄清:
我们的生产数据库每晚从另一个系统的文件提取中重新创建。我们只报告生产数据库......从来没有更新过。
每晚流程:据
我所知......
每天晚上数据库表都会被截断
这些表通过一系列批量插入语句填充
索引被重建
我在我的工作站上运行 MySQL 5.5 服务器以进行科学数据分析,并想知道如何配置 MySQL 以便在性能方面发挥最大作用。我通常运行的查询类型涉及 10-20 个表的连接,并且可以运行很长时间,一到几分钟也不例外。只有极少数用户同时访问数据库(最多 5 个)。我将服务器从具有 2.2 GHz 双核和 4 GB RAM 的联想 Thinkpad T61 移动到以下带有手工选择组件的全新机器:
第一次测试(在两台机器上运行相同的查询)显示新机器的速度有了明显的提高,但查询仍然需要很多时间,我原以为会有更多的提升。有问题的查询得到了相当好的优化,即所有表都有适当的键,这些键也被用作“解释扩展”。
现在到我当前的 MySQL 设置:首先我应该提到我很久以前从 MyISAM 转移到 Innodb。
我的一些 my.ini 调整(即偏离默认设置):
# Maximum size for internal (in-memory) temporary tables. If a table
# grows larger than this value, it is automatically converted to …Run Code Online (Sandbox Code Playgroud) 我有一个大表(几亿行),我想对其进行有效分区。我的问题是分区大小和分区数之间是否存在权衡。据我所知,分区中使用的列上的大多数查询会更快,因为查询(对于大多数查询)只需要在适用于查询的分区内进行搜索。因此,为了最大限度地提高效率,您应该将大表划分为最大数量的分区,从而使每个分区尽可能小是有道理的。对于 MySQL,这意味着 1024 个分区。但是,拥有大量分区是否有任何性能缺陷?是这样,如何找到最佳分区数?
注意:在 stackoverflow 上已经有一个有点类似的问题,但只有一个答案,(从我的角度来看)没有达到目标。所以我会用我自己的方式陈述这个问题......希望它更清楚
我们在用户在 Drupal 中运行查询/视图时遇到问题,这有时会导致我们的网站冻结。发生冻结是因为查询导致数据库连接数上升到 400+,并且基本上只要站点超过 100 个数据库连接,站点就会非常慢并且没有响应。
我们正在使用 MySQL Red Hat Linux 运行 Amazon RDS
我们在前端应用服务器上有足够大的EC2,以及足够大的RDS。
我们现在解决这个问题的方法是找到有问题的查询,并杀死它。一旦查询被终止...我们的数据库连接将下降到大约 20,这是您在监视站点统计信息时看到的正常数量。
有没有办法停止有问题的查询并在它运行太长时间并消耗连接之前将其杀死?我试图在错误查询发生之前自动终止它,或者至少在 30 秒后意识到它是一个错误查询并终止它。
在对其执行任何大型插入或选择语句之后,MySQL 似乎希望将整个表保留在缓存中(表大小 = ~20GB)。现在我的 innodb 缓冲池是 20GB。总内存为 32GB。我将提供一些内存使用情况和 innodb 状态的输出以及 mysqltuner 的输出。过去几天一直让我发疯。请帮忙!我感谢任何反馈,如果您需要更多信息,请告诉我。
此外,执行“FLUSH TABLES”只会在内存中关闭并重新打开它们。至少我认为这就是正在发生的事情。这是我执行一堆插入之前的 innodb 当前内存状态:
----------------------
BUFFER POOL AND MEMORY
----------------------
Total memory allocated 21978152960; in additional pool allocated 0
Dictionary memory allocated 6006471
Buffer pool size 1310719
Free buffers 347984
Database pages 936740
Old database pages 345808
Modified db pages 0
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 78031, not young 0
0.00 youngs/s, 0.00 non-youngs/s
Pages read 551887, …Run Code Online (Sandbox Code Playgroud) 我执行以下命令行语句来优化表:
optimize table tablename;
是否有任何命令或语句可以将所选数据库中的所有表一一优化?
mysql ×8
innodb ×3
performance ×3
memory ×2
mysql-5.1 ×2
mysql-5.5 ×2
amazon-rds ×1
backup ×1
datafile ×1
erd ×1
my.cnf ×1
mysql-5 ×1
optimization ×1
partitioning ×1
sql-server ×1