摘要:varchar(N) 的N代表什么? N代表“字符” varchar(32)表示:可以存储 32 个字符,包括中文和其他字符。 跟中英文无关,也就是该字段可以存储 32 个中文,或者是 32 个英文,或者是 32 个中文和英文的混搭都行。但如果字符数超过 32 个的话就会报错。 参考:什么是字符?什
阅读全文
摘要:总结 在UTF-8字符集下,一个中文字符占用3个字节,一个英文字符占用1个字节。 在GBK编码下,则一个中文汉字占2个字节,英文占1个字节 字符:用输入法单独打出的任何单个的内容。对于中文和英文而言,以下内容分别都是1个字符: (1)1个中文字,例如“是” (2)1个英文字母,例如“T” (3)1个
阅读全文
摘要:前言 提到 “数据库的查询耗时过长”, 很多情况下都与索引有关系: 或是因为索引忘记创建 或是因为SQL查询条件未满足“最左前缀原则” 以上问题的迷惑性和隐蔽性还不太强,一般都可以迅速发现root cause并拿出解决方案。 但是如果编程人员已经明确: 我已经加了所需的索引 我写的SQL也满足了所谓
阅读全文
摘要:总结 一致性读 使用“可见性规则”:https://www.processon.com/mindmap/655307fe6a2ff722ead8d9e4 一致性写(当前读) 更新数据都是先读后写的,而这个读,只能读当前的值,称为“当前读”(current read) 行锁 (两阶段锁协议) 一、问题
阅读全文
摘要:首先我们要解决长事务,事务不提交,就会一直占着 MDL 锁。在 MySQL 的 information_schema 库的 innodb_trx 表中,你可以查到当前执行中的事务。如果你要做 DDL 变更的表刚好有长事务在执行,要考虑先暂停 DDL,或者 kill 掉这个长事务。 但考虑一下这个场景
阅读全文
摘要:元数据锁 MDL https://www.processon.com/mindmap/655307fe6a2ff722ead8d9e4 问题描述 给一个表加字段,或者修改字段,或者加索引,需要扫描全表的数据。在对大表操作的时候,你肯定会特别小心,以免对线上服务造成影响。而实际上,即使是小表,操作不慎
阅读全文
摘要:https://www.processon.com/mindmap/655307fe6a2ff722ead8d9e4
阅读全文
摘要:MySQL 的逻辑架构图 详细解答 https://www.processon.com/mindmap/655307fe6a2ff722ead8d9e4
阅读全文
摘要:可能原因1 脏数据存在 可能原因2 当你手动刷sql修改表结构时,可能这张表正有写库操作。 一边写库一边修改表结构,就会出现这种错误。。。原因未知,猜测和锁表有关系 两次错误提示: 详细的数据是不一样的....而且日期是今天的,说明不是脏数据 等待写库程序结束,再刷表就没有报错了
阅读全文
摘要:TODO: http://www.ppmy.cn/news/35772.html https://www.dandelioncloud.cn/article/details/1597934023446052866
阅读全文
摘要:总结: #当前时间戳(秒级):2020-08-08 12:09:42 select current_timestamp(); #当前时间戳(毫秒级):2020-08-08 12:09:42.192 select current_timestamp(3); # 秒级时间戳:1606371113 (自1
阅读全文
摘要:总结 replace into执行过程,若碰到主键冲突,则是先删除该条记录,再插入新记录。 replace into若主键相同,主键之外字段会得到更新;若主键不同,功能同insert into replace into和insert into区别在于,insert into插入与主键相同记录会报错,
阅读全文
摘要:总结 1.当创建(a,b,c)联合索引时,相当于创建了(a)单列索引,(a,b)联合索引以及(a,b,c)联合索引想要索引生效的话,只能使用 a和a,b和a,b,c三种组合;当然,我们上面测试过,a,c组合也可以,但实际上只用到了a的索引,c并没有用到! 2.不完全总结下,单列索引更适合查询条件只有
阅读全文
摘要:总结 由于联合索引构建存储方式(InnoDB联合索引的数据结构是什么?)是根据第一个索引列“单调递增”排序,如果第一列相等则再根据第二列单调递增排序,依次类推。。。也就是说,对于(b,c,d)联合索引来说,相当于创建了(b)、(b、c)(b、c、d)三个索引 索引的第一列也就是b列可以说是从左到右单
阅读全文
摘要:总结 对于联合索引来说只不过比单值索引多了几列。 联合索引的所有索引列都出现在索引树上,并依次顺序比较几个列的大小。 InnoDB引擎会首先根据第一个索引列“单调递增”排序,如果第一列相等则再根据第二列排序,依次类推. 必看例子: 数据表T1有字段a,b,c,d,e,其中a是主键,除e为varcha
阅读全文
摘要:为了一致性和节省存储空间: 已经维护了一套主键索引+数据的B+Tree结构,如果再有其他的非主键索引的话,索引的叶子节点存储的是主键,这是为了节省空间,因为继续存数据的话,那就会导致一份数据存了多份,空间占用就会翻倍。 另一方面也是一致性的考虑,都通过主键索引来找到最终的数据,避免维护多份数据导致不
阅读全文
摘要:在使用InnoDB存储引擎时,如果没有特别的需要,请永远使用一个与业务无关的自增字段作为主键。 为什么InnoDB表必须有主键? Mysql索引设计如此....mysql设计的就是innoDB把你的数据和主键索引用B+Tree来组织的,没有主键他的数据就没有一个结构来存储。即:主键索引就是数据文件本
阅读全文
摘要:总结 1.mysql对这个节点大小设置的是16K,用下面这个SQL就是可以查到 show global status like 'Innodb_page_size' 2.树的高度只有3的情况下就能存储2千多万的数据,而且mysql底层的索引他的根节点,是常驻内存的,直接就放到内存的。所以次数再减去1
阅读全文
摘要:show profile 命令用于跟踪执行过的sql语句的资源消耗信息,可以帮助查看sql语句的执行情况,可以在做性能分析或者问题诊断的时候作为参考。 1.打开配置 show profile跟踪记录SQL执行情况的需要打开配置才能使用,如下图所示: 2.profiles命令--查看某SQL语句“所有
阅读全文
摘要:总结 TODO 问题 在开始阅读本文之前,可以先思考一下下面两个问题。 众所周知,MySQL 有四大特性:ACID,其中 D 指的是持久性(Durability),它的含义是 MySQL 的事务一旦提交,它对数据库的改变是永久性的,即数据不会丢失,那么 MySQL 究竟是如何实现的呢?MySQL 数
阅读全文