问题:我有两张相当大的桌子。用于用户之间消息的“墙”表,2 GB,900 万行,“章”表,200 万行,18 GB。我想保持“墙”表的活动行数较小,同时我想减小章节表的大小。我犯了一个错误,一开始没有压缩文本数据,我想开始压缩档案中的数据。
对于“墙”表,我认为比某个墙 ID 更旧的所有内容都将被传输并压缩到“wall_archive”。任何想要查看较旧帖子的人都会获得一个“查看存档”链接,其中较旧的帖子查询使用存档表。然后我不时运行一个 cron 作业来执行此操作,并且存档的最后一个墙 ID 将存储在某处以供参考。我在这里走正确的方向吗?
我不太确定如何使“章节”表易于管理。也许归档更少,更需要对表(或两者)进行分区。但最好的方法是什么?我正在考虑将“故事”ID 分成赔率和偶数,并将章节分成两个表格,但我会再次遇到同样的问题。或者我可以存档在某个日期之前修改的故事。或者在某个故事ID之前。关于可扩展解决方案的任何建议?
最后,我应该如何压缩文本数据?我应该在第 9 级使用 PHP 的 gzcompress 函数将文本数据存储到 BLOB 列中,然后在检索时 gzuncompress 数据吗?还是应该使用 MySql 的 COMPRESS/UNCOMPRESS 函数?我倾向于使用 PHP,以防我将 Web 服务器与数据库服务器分开,在那里我可以让 PHP 执行压缩过程而不是更有价值的数据库服务器,但我想知道最佳实践是什么。
注意事项:我仍然需要能够轻松访问旧的“章节”数据。如果需要,“墙”数据可以放入较慢的存储中,但目前没有必要。
环境: 6 Core AMD Opteron, 16 GB RAM, 256 GB SSD for MySql, Percona Server 5.5, Apache, CentOS 6, PHP 5.3, innodb_file_per_table 已启用,数据库和网络服务器在同一台机器上运行,数据库总大小为 30 GB,所有表是 InnoDB
架构:
CREATE TABLE `wall` (
`id_wall` int(10) unsigned NOT NULL AUTO_INCREMENT,
`id_author` int(10) unsigned NOT …Run Code Online (Sandbox Code Playgroud) 这是我当前的查询:
SELECT BusinessID as ID,
111151.29341326*SQRT(pow(-6.186751-X(LatLong),2)+pow(106.772835-Y(LatLong),2)*0.98838574205337) AS Distance from
(
SELECT *
FROM
tableauxiliary
WHERE
MBRContains(
GeomFromText (
'MULTIPOINT(-6.1934985598076 106.76604791159,-6.1800034401924 106.77962208841)'
),
Latlong)=1
AND Prominent >15
) AS TA
Having Distance <= 18238
ORDER BY
Distance
LIMIT
0, 45
Run Code Online (Sandbox Code Playgroud)
请注意,他们我使用了子查询。它使用子查询的原因是因为我想要
MBRContains(
GeomFromText (
'MULTIPOINT(-6.1934985598076 106.76604791159,-6.1800034401924 106.77962208841)'
),
Latlong)=1
Run Code Online (Sandbox Code Playgroud)
首先要完成。这将查询时间从 19 秒减少到 0.9 秒。
有没有办法提示mysql查询优化器,这样我就不需要使用子查询
更新:
我试过:
SELECT BusinessID as ID,
111151.29341326*SQRT(pow(-6.186751-X(LatLong),2)+pow(106.772835-Y(LatLong),2)*0.98838574205337) AS Distance from tableauxiliary
USE Index (LatLong_2,FullTextSearch)
WHERE
MBRContains(
GeomFromText (
'MULTIPOINT(-6.1934985598076 106.76604791159,-6.1800034401924 106.77962208841)'
),
Latlong)
AND Prominent >15 …Run Code Online (Sandbox Code Playgroud) 我们有一个 innodb mysql 数据库,所以我们迷失了许多不同的 mysql 备份策略。有人谈论mysqldump,有人谈论第三方工具。有些表我们还计划运行分区。有什么好工具可以帮助完成这项任务?
我正在尝试使用 SELECT ... INTO OUTFILE 查询转储一个大表(40GB,600,000 行)。我想使用它,因为我希望我的结果以特定方式排序(因此 mysqldump 不够好)。
问题是,我收到错误代码 28。我很确定这是因为默认 /tmp 位置的磁盘空间不足。如果我可以在运行时指定用于 tmp 的位置,我在其他地方的磁盘上有足够的空间。
我发现我可以通过修改 my.cnf 来更改 tmpdir,但是我没有足够的服务器权限来修改它或重新启动 mysqld。
这里的解决方案是什么?
编辑:一些答案建议使用 mysql -e。我可能不得不走这条路并对我的文件进行后处理。我想使用 SELECT ... INTO OUTFILE 的原因是因为我想
fields terminated by '\t'
escaped by '\\'
lines terminated by '\r\n' ;
Run Code Online (Sandbox Code Playgroud) 最初使用 5GB+ 填充数据库以避免大型事务日志时的标准流程是什么?根据我的理解,日志文件会在初始加载后跳转到较大的大小,并且从那时起磁盘空间不会减少。定期事务日志备份将释放文件中的空间,但文件仍会很大。
那么是否建议将目标数据库设置为简单备份,加载数据,使用 CHECKPOINT 截断日志,然后将数据库设置为完全备份模式?
此外,我知道可以对日志执行收缩文件操作,但有人说永远不要使用它,其他人似乎建议将其作为解决方案。有什么想法吗?
我正在尝试将此 CSV 文件导入 MySQL,该文件似乎可选地由多个字符括起来。不幸的是,MySQL 只支持一个字符作为字段分隔符。
我被困在 SQL 中完成整个过程,因为它是更大程序的一部分 - 所以脚本是不可能的。
数据示例:
reportdata, commission, total, chargeback, company
",123,""$116.00 "",""$604.00 "",""($88.00)"", foo
Run Code Online (Sandbox Code Playgroud)
除了尝试在临时表上执行一堆字符串操作之外,我感到很困惑。
有任何想法吗?
我有一个 InnoDB 客户表,按 KEY 分区,每个分区是一个美国州。我有电话号码索引,性能很棒。我们还需要在给定的美国州中按姓氏进行 SELECT。我应该在姓氏 AND 状态上创建索引,还是没有意义,因为表已经按状态分区了?
这是否会占用不必要的空间,因为 InnoDB 应该已经知道哪个分区是哪个状态,并且它只需要在该分区中找到与姓氏匹配的所有行?
我们没有做任何连接......这只是一个简单的查询,如下所示:
SELECT * FROM table WHERE lastname = "Smith" AND state="NY"
Run Code Online (Sandbox Code Playgroud) 我需要创建一个转储文件,其中包含来自数据库的单个存储过程,而不是所有例程。
我试过这样的事情:
mysqldump -u root -pssmart --skip-triggers --no-create-info --no-data \
--no-create-db --skip-opt test_fshop SP_ITEM_SALES_REPORT -R \
> test_fshop_routines.sql
Run Code Online (Sandbox Code Playgroud)
这test_fshop是我的数据库名称,SP_ITEM_SALES是我的 SP。我想要我的 SP 作为 .sql 文件。
是否可以使用 2 个自动增量值?
请帮我
我在亚太(新加坡)地区的亚马逊 rds 上创建了一个中型实例。我已经用主密码创建了我的主用户。它在我本地 PC 上安装的工作台上工作/连接正常。当我要在该实例上创建函数时,它会显示以下错误
错误 1418:此函数的声明中没有 DETERMINISTIC、NO SQL 或 READS SQL DATA,并且启用了二进制日志记录(您可能希望使用不太安全的 log_bin_trust_function_creators 变量)
在我的实例中,我的变量 (log_bin_trust_function_creators) 显示为 OFF。现在,当我使用变量进行更改时
SET GLOBAL log_bin_trust_function_creators = 1;
Run Code Online (Sandbox Code Playgroud)
它给了我另一个错误
错误代码:1227。访问被拒绝;您需要(至少其中之一)此操作的 SUPER 权限
我不知道如何解决这个错误。
有人可以帮忙吗???
mysql ×9
backup ×4
innodb ×3
mysql-5.5 ×3
mysqldump ×3
amazon-rds ×1
csv ×1
import ×1
index ×1
logs ×1
optimization ×1
partitioning ×1
phpmyadmin ×1
sql-server ×1
subquery ×1