我目前正在阅读CJ Date 的“SQL 和关系理论”。虽然我在书中讲得很远,但我还是有一些基本问题。我想知道“逻辑差异”这个词是什么意思,这本书确实试图用例子解释这个词,但并没有真正解释它的意思(或者我可能理解错了??)
这是书中的一小部分:
我说过关系和关系的图片之间存在逻辑差异。逻辑差异的概念源自维特根斯坦的格言:
我直观地知道逻辑差异意味着什么,我知道关系和关系图片之间的区别是什么。我想要的是“逻辑差异”概念的正式定义,所以我很清楚它的含义。
从 MySQL 5.1 开始,数据不再需要完全在内存中。
我读过索引列(我认为整个索引结构)必须仍在内存中(MySQL High Availability,2010,第 533 页,“MySQL Cluster 将所有索引列保留在主内存中”)。
鉴于此,如果没有足够的内存(即,一个巨大的数据库(> 100GB 或 1TB),在具有低内存配置的服务器上运行(例如,2 个数据节点,每个节点具有 1GB 的 RAM))会发生什么情况?
假设我的站点中有一个用户表,其中表中有大约 2-3 百万个用户(记录)。
为了加快我的登录过程,拆分我的用户表是否是一种好方法,一个用于他们的信息,另一个用于他们的登录。
如果我们可以从一张表中运行类似于下面的查询:
select username,password from users where username=`test` AND password=****
Run Code Online (Sandbox Code Playgroud)
是否有必要拆分它,这是否会加快我网站的登录过程?
我有一个几乎从不查询的数据包日志数据库。它只需要快速插入即可。我使用 InnoDB 是因为我想保持 ACID 合规性,因为即使丢失一个数据包也可能对我们的客户造成损害。在性能调优方案中,我通过多个数据库连接向服务器发送 1,000,000 个数据包。但是无论我在 my.cnf 中使用什么设置,我都无法让 mysqld 进程在 12 核的系统上使用超过 900% 的 CPU。(盒子上没有其他东西在运行。)
我设置了以下内容
innodb_file_per_table = 1innodb_write_io_threads = 64innodb_read_io_threads = 64innodb_thread_concurrency = 0如果我使用 MyISAM,我可以在大约 6 秒内写入所有数据包。但是 InnoDB 大约需要 25。我可以让 MySQL 使用剩余的系统资源并更快地插入吗?
编辑:这是表的架构:
+-------+----------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------------------+------+-----+---------+-------+
| t | bigint(20) unsigned | YES | | NULL | |
| a | char(1) | YES | | NULL | |
| sa | …Run Code Online (Sandbox Code Playgroud) 这个程序
create proc dbo.Get_Accounts as
begin
declare @current_date datetime
set @current_date = dbo.fn_currdate()
select [fields]
into dbo.current_accounts
from linkedserver.database.dbo.accounts
where date = @current_date
end
Run Code Online (Sandbox Code Playgroud)
10 分钟后不断失败,并显示以下错误消息:
服务器:消息 7399,级别 16,状态 1,第 1 行 OLE DB 提供程序“SQLOLEDB”报告了错误。由于达到资源限制,提供程序终止了执行。[OLE/DB 提供程序返回消息:超时已过期] OLE DB 错误跟踪 [OLE/DB 提供程序 'SQLOLEDB' ICommandText::Execute 返回 0x80040e31:由于达到资源限制,提供程序终止执行。]。
但是,当我在具有硬编码日期的交互式查询窗口中从同一个数据库(不在远程数据库上)运行相同的查询时:
select [fields]
into dbo.current_accounts
from linkedserver.database.dbo.accounts
where date = '1/20/2012'
Run Code Online (Sandbox Code Playgroud)
它在 30 秒后返回。
本地服务器是 SQLSERVER 2008,远程服务器是 SQLSERVER 2000。
我们做了以下工作,但无济于事:
我希望创建一个 cron 作业来备份我的 MySQL 数据库。我正在使用这个命令:
$ mysqldump --user="User" --password="Password" -A
--single-transaction > /home/user/Export-`date +"%F"`.sql
Run Code Online (Sandbox Code Playgroud)
这导致 2.5 MB 的文件大小。但是,当我使用同一用户使用 phpMyAdmin 导出功能时,我得到一个 3.7 MB 的文件。
有人可以解释这些差异吗,如果我做错了什么?
我需要进行大量的统计分析才能向用户提供一些数据。目前,我从 mysql 捕获数据并通过PHP数组处理它们。但是,mysql 临时表要好得多(比 PHP 数组效率更高、速度更快;显然是由于它们的机制)。
我的暂定解决方案是在每次请求(即连接)时形成一个临时表来导入和处理数据。但是,我不确定同时创建多个临时表是否有缺点?
这会给mysql服务器带来问题吗?或者我可以在众多同时请求中使用它作为 PHP 数组的替代方案?
假设我有一个 1 对 N 的关系(person_id, pet_id)。我有一张表,pet_id主键在哪里。
我知道 InnoDB 二级索引本质上是一个 B 树,其中值是行的相应主键值。
现在,假设一个人可以拥有数千只宠物,而我通常希望一个人的宠物按pet_id. 那么,如果在第二个索引记录的排序会的问题(person_id, pet_id)或只是person_id用pet_id的该person_id是无序。猜到后来。
那么,如果person_id是非唯一的,记录是按物理排序(person_id, pet_id)还是仅排序pet_id?
谢谢
问题/问题:获取错误: [Err] 1615 - Prepared statement needs to be re-prepared
我有一个存储过程,其中包含一个准备好的语句和一个视图
DROP PROCEDURE IF EXISTS `sampleProc`;
DELIMITER ;;
CREATE DEFINER = `root`@`localhost` PROCEDURE `sampleProc`()
BEGIN
SET @select = "SELECT * FROM `viewSample` ";
PREPARE stmt FROM @select ;
EXECUTE stmt ;
DEALLOCATE PREPARE stmt ;
END ;;
DELIMITER ;
Run Code Online (Sandbox Code Playgroud)
以下调用有时会出错 CALL sampleProc();
可能的解决方法/解决方案
看来最好的解决方案是增加 table_definition_cache 的值,但似乎不起作用,因为它已经从 1400(默认)增加到 16384。 table_open_cache 也增加到 32162
Variable_name Value
table_definition_cache 16384
table_open_cache 32162
table_open_cache_instances 4
Run Code Online (Sandbox Code Playgroud) 过去几天我们一直在努力解决一个问题。我们要为一个有60M记录的大表添加索引。起初我们尝试使用基本的 mysql 语法添加它。但它堵塞了我们的生产数据库。该表在生产查询中使用非常频繁。所以一切都受苦了。
我们的数据库托管在 AWS RDS 上。它的Mysql 5.7。我们使用 Laravel 作为 PHP 框架
我们读到的下一件事是,我们可以将当前表复制到新表中。然后为新表添加索引。然后移动 laravel 模型以使用新表。我们认为这是有道理的,而且很容易
但是将表数据从一个表复制到新表需要花费相当多的时间。我们的计算表明这需要几天的时间。我们尝试使用 Laravel 以及 SQL 命令。但无论哪种方式都太慢了。
然后我们尝试将数据导出为 CSV 并导入,但还是太慢了。前几百万条记录插入速度很快,但随后表的插入速度会变得非常慢。
最后我们尝试了mysqldump,我们意识到它在插入时也会锁定新表,所以也许这就是它足够快的原因。将表格复制到新表格大约花了 6 个小时。但是我们在这个方法中丢失了 2M 条记录。我们还检查了导出/导入时有多少记录进入现有表,只有大约 100K。因此导出/导入丢失了 190 万条记录,我们无法找出原因。
在经历了所有这些不同的方法之后,我们决定让应用程序停机并在巨大的表上添加索引
我想知道其他人也面临这个问题吗?有没有办法在一个巨大的表上添加索引而不导致生产停机?或者有没有更快的方法来复制大的 mysql 表而不丢失数据?
mysql ×8
innodb ×2
memory ×2
mysql-5.5 ×2
amazon-rds ×1
backup ×1
dynamic-sql ×1
myisam ×1
mysql-5 ×1
mysql-5.6 ×1
mysql-5.7 ×1
mysqldump ×1
ndbcluster ×1
optimization ×1
primary-key ×1
sql-server ×1
view ×1