mysql备忘录
mysql 4.x以前,varchar长度单位为字节;5.x以后,varchar长度单位为字符。
字段类型括号含义:
varchar(长度) timestamp(精度) int(显示长度(配合zerofill使用))
查询单用户最大连接数:
show variables like 'max_user_connections';
查询当前连接:
show processlist;
innodb 索引前缀长度:767个'字节' (https://dev.mysql.com/doc/refman/8.0/en/innodb-limits.html)
utf8mb4字符集单个字符最大长度四字节, 767/4 = 191.75,所以现象如下:
CREATE TABLE `tt` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `str` varchar(256) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `str`(`str`(192)) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 错误:Specified key was too long; max key length is 767 bytes
CREATE TABLE `tt` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `str` varchar(256) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `str`(`str`(191)) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 成功
innodb区间锁死锁触发实例:
注:id 9 10为与同一个索引空白区间,双方都用select for update占锁,而insert操作又都要等待对方的锁释放。结构右侧会话检测到死锁而释放,左侧会话得以推进。
注:innodb_version = 5.7.28