我有一个带有 InnoDB 数据库的 symfony 应用程序,它有 57 个表,大约 2GB。数据库的大部分大小驻留在单个表中(~1.2GB)。我目前正在使用 mysqldump 每晚备份数据库。
由于我的 comcast 连接,通常如果我手动运行转储,我与服务器的连接将在转储完成之前超时,导致我不得不重新运行转储。[我目前运行一个每晚执行转储的 cron,这仅适用于我手动运行的转储。]
有没有办法加快连接超时问题的转储,同时也可以限制服务器被这个进程占用的时间?
顺便说一句,我目前正在努力减少整个数据库的大小来解决这个问题。
我在某些具有大量可能结果集的数据库查询上遇到了性能问题。
有问题的查询,我AND
在 WHERE 子句中有三个
条款的顺序重要吗?
就像,如果我把 ASI_EVENT_TIME 子句放在第一位(因为这会从任何子句中删除大部分结果。
这会改善查询的运行时间吗?
询问:
SELECT DISTINCT activity_seismo_info.*
FROM `activity_seismo_info`
WHERE
activity_seismo_info.ASI_ACTIVITY_ID IS NOT NULL AND
activity_seismo_info.ASI_SEISMO_ID IN (43,44,...,259) AND
(
activity_seismo_info.ASI_EVENT_TIME>='2011-03-10 00:00:00' AND
activity_seismo_info.ASI_EVENT_TIME<='2011-03-17 23:59:59'
)
ORDER BY activity_seismo_info.ASI_EVENT_TIME DESC
Run Code Online (Sandbox Code Playgroud)
查询的解释:
+----+-------------+---------+-------+---------------------------+--------------+---------+------+-------+-----------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------+-------+---------------------------+--------------+---------+------+-------+-----------------------------+
| 1 | SIMPLE | act...o | range | act...o_FI_1,act...o_FI_2 | act...o_FI_1 | 5 | NULL | 65412 …
Run Code Online (Sandbox Code Playgroud) 我登录到我的服务器来检查数据库的状态,并注意到SHOW PROCESSLIST;
有大量非常旧的连接正在休眠。
在连接应该被杀死之前,连接时间限制应该持续多长时间?
如何在 MySQL 5.0.51a-3ubuntu5.4 中设置时间限制?
笔记:
我正在使用 PHP 5.2.x 和 symfony 框架 1.2。
今天早上 MySQL 对我崩溃了。
除了标准的 MySQL 包含的数据库之外,我使用的一切都是 InnoDB。
我试图重新启动 MySQL 守护进程,但它失败了两次。
然后我重新启动了整个服务器,MySQL 正确启动并且从那以后一直运行良好。
初始崩溃的 mysqld 日志文件包含以下内容:
120927 10:21:05 mysqld_safe Number of processes running now: 0
120927 10:21:06 mysqld_safe mysqld restarted
120927 10:21:12 [Note] Plugin 'FEDERATED' is disabled.
120927 10:21:12 InnoDB: The InnoDB memory heap is disabled
120927 10:21:12 InnoDB: Mutexes and rw_locks use GCC atomic builtins
120927 10:21:12 InnoDB: Compressed tables use zlib 1.2.3
120927 10:21:12 InnoDB: Using Linux native AIO
120927 10:21:13 InnoDB: Initializing buffer pool, size = 4.0G
InnoDB: …
Run Code Online (Sandbox Code Playgroud) 可能的重复:
select count(*) 和 select count(any_non_null_column) 之间有什么区别?
我听说人们普遍认为,在计算查询中的行数时,您不应该执行 a,COUNT(*)
而应该对索引列进行计数。
我见过 DBA,在计算行数时,运行SELECT COUNT(1) FROM table;
.
什么是1
查询?
我试过输入其他数字 (2, 0, -1) 并且结果总是与使用 1 相同。
这只是一种快捷方式,而不是列出要计算的特定列吗?
使用常量与列出列名是否有任何性能差异?
我目前使用的是 MySQl 5.1.60。
我目前使用 phpmyadmin 进行大部分数据库管理。它工作得很好,但我对其他可能工作得更快/更有效/等的工具感兴趣......
在 *nix 机器上用于 MySQL 的最佳和/或替代管理工具是什么?
我使用 mysqldump 创建一个用于备份的平面文件。我已使用此文件在备用服务器上重新创建数据库。我在命令行上通过 ssh 运行导入过程,但收到多个Packet too Large
错误。
我用更大的 max_allowed_packet(即 1000M)重新启动了 mysql,但仍然收到错误消息。我什至尝试在导入文件中设置 max_allowed_packet,仍然收到错误。
有没有办法确保设置 max_allowed_packet 和/或使用 mysqldump 来创建不会导致此问题的文件?
以供参考:
未压缩的 mysqldump 文件约为 2GB
数据库类型是 INNODB
我为我的公司运行了一个 PHP symfony-framework web 应用程序,它对所有连接使用单一的数据库登录,无论用户是管理员还是客户端。
我知道更高安全性的系统通常为不同级别的用户使用不同的登录名。
无论是否使用框架,这是我应该使用的安全功能吗?
应用程序是基于 Web 还是基于 Intranet 有关系吗?
澄清一下:我是否应该为 symfony 创建一个插件来实现多个数据库登录,我是否应该为我创建的任何其他不基于框架的应用程序执行此操作?
如果您想知道,我正在使用 PHP5 和 MySQL。
我有一个查询(似乎)随机挂在特定查询上。我的大多数网站用户在此查询运行时都没有问题,但有一些用户在网站上遇到超时问题,当我检查processlist
它时,它被卡住了copying to tmp table
。
我相信硬盘驱动器没有跟上,这导致复制到 tmp 表时挂起。
我不相信我可以更有效地优化查询。我想知道是否可以将服务器的第二个硬盘驱动器设置为临时表存储,这样我就可以分散服务器上的一些负载。
The query:
SELECT DISTINCT
activity_seismo_info.ID,
activity_seismo_info.CREATED_AT,
activity_seismo_info.UPDATED_AT,
....
activity_seismo_info.ASI_EXTRA_5,
seismo.ID,
....
seismo.SEISMO_NOTES
FROM `activity_seismo_info`
JOIN activity_info ON (activity_seismo_info.ASI_ACTIVITY_ID=activity_info.ID)
JOIN location ON (activity_info.ACTIVITY_LOCATION_ID=location.ID)
LEFT JOIN seismo ON (activity_seismo_info.ASI_SEISMO_ID=seismo.ID)
WHERE location.ID='193'
ORDER BY activity_info.ACTIVITY_EVENT_TIME DESC LIMIT 30
Run Code Online (Sandbox Code Playgroud)
我使用的是带有 2GB RAM 和两个硬盘驱动器的 P4(第二个硬盘驱动器未使用)
PHP5.2
MySQL 5.0.51a-3ubuntu5.4
带有 Propel 的 symfony 1.2 应用程序
更新
感谢@DTest 的建议,我发现我的查询在对结果运行限制之前返回了表中的所有行。但是为了将来参考,有没有办法设置 MySQL 以使用第二个硬盘驱动器作为临时表的“临时”驱动器?