我想了解以下内容。
假设我有一个复杂的查询,假设通过求和和排序将一组 5 个表连接起来。
抛开对查询本身的任何优化,例如索引等。
使用LIMIT?是否有任何显着的性能优势?我假设在应用 LIMIT之前必须处理所有查询(和结果),因此使用 LIMIT 来检索结果的子集,这是否提供了任何显着/显着的改进?
我有一张表,如下所示:
CREATE TABLE SomeTable (
id int unsigned NOT NULL AUTO_INCREMENT,
status enum('broken','repaired') NOT NULL,
from datetime NOT NULL,
until datetime NOT NULL,
brought_in timestamp,
brought_by varchar(255) NOT NULL,
repair_status enum('unpayed', 'payed') DEFAULT NULL,
payed_when timestamp,
delivered_when timestamp,
primary key(id)
);
Run Code Online (Sandbox Code Playgroud)
当我创建表时,如果我做了SHOW CREATE TABLE然后我看到列brought_in被定义为具有当前时间戳ON INSERT和ON UPDATE.
但是我没有在我的创建表中添加这样的指令。
为什么它不像其他列那样让它为空?
现在,在每次插入或更新另一列时,它都会添加当前时间戳。我不想要那个。
它不会对其他列执行此操作。我究竟做错了什么?
我有一个关于交易的相当基本的问题。
假设Account有一个列金额的表。现在我们有以下代码:
BEGIN
$amount = SELECT amount FROM ACCOUNT WHERE id = 123;
$amount = $amount - 100;
UPDATE ACCOUNT SET amount = $amount WHERE id = 123;
COMMIT
Run Code Online (Sandbox Code Playgroud)
现在,如果此代码段由 2 个事务并发运行,T1 和 T2 会发生什么?
我知道在 MySQL 中默认隔离级别是REPEATABLE READ.
所以假设最初的金额是 500。
那么当 2 笔交易完成时,最终的金额是 300 还是 100?
我的意思是当他们开始从表中读取时,我猜这是一个共享锁。
当一个人更新表时,它会获得一个排他锁吗?那么另一笔交易会发生什么?它会继续处理它开始时“查看”的数量,即 500?
我读到 MySQL 无法在 2 个范围条件下使用索引,因为没有“松散索引扫描”。
“松散索引扫描”到底是什么意思?
使用触发器时,如果对表进行了更新,则执行触发器。这是非常方便的。但是,我需要的是执行外部脚本。
是否可以配置 MySQL,以便在触发/更改表中的值时执行外部进程/脚本?
当客户端连接丢失时,事务会发生什么。
例如,客户端是一个 Web 应用程序代码,它启动到远程服务器实例的事务。客户端向服务器发送sql代码,等待事务完成。
如果网络连接失败会怎样?这是否取决于我们在交易中的位置?它无关紧要吗?流产了吗?
mysql ×6
transaction ×2
concurrency ×1
index ×1
innodb ×1
join ×1
linux ×1
network ×1
performance ×1
terminology ×1
timestamp ×1
trigger ×1