MYSQL学习笔记
yangzhengqui
这个作者很懒,什么都没留下…
展开
-
Mysql学习笔记--删除数据
首先 innodb_file_per_table 要设置为ON innodb_file_per_table: 1 这个参数设置为 OFF 表示的是,表的数据放在系统共享表空间,也就是跟数据字典放在一起; 2 这个参数设置为 ON 表示的是,每个 InnoDB 表数据存储在一个以 .ibd 为后缀的文件中。 如果设置为OFF,则drop table也是不会回收空间的。 删除流程 MYSQL的删除并不是真正的把数据删除,只是标志为删除。 比如删除ID为300的行,则是把这个记录标记为删除。后续插入的时候是会复用原创 2020-08-12 13:55:38 · 237 阅读 · 0 评论 -
MYSQL学习笔记---抖动一下
有时在正常情况下,工作的很好的SQL语句,突然就变慢了一下。MYSQL发生了抖动,这是什么原因? 首先从MYSQL的wal机制说起。 INNODB在处理更新语句的时候,只是写了一次redo log就返回了。 那么就会产生“胀页”。当内存数据页跟磁盘数据页内容不一致的时候,我们称这个内存页为“脏页”。内存数据写入到磁盘后,内存和磁盘上的数据页的内容就一致了,称为“干净页”。 产生了胀页,就要找时间进行flush,把内存的数据刷入到磁盘里面,保持数据的一致。 以赊账的例子来看: 那么发生MYSQL抖动一下的情原创 2020-08-10 19:42:40 · 101 阅读 · 0 评论 -
MYSQL学习笔记---字符窜加索引
比如邮箱登陆的系统,有一张表: mysql> create table SUser( ID bigint unsigned primary key, email varchar(64), ... )engine=innodb; 有一条SQL语句: mysql> select f1, f2 from SUser where email='xxx'; 不在email加索引的话,就会进行全盘扫描,效率比较低。 MySQL 是支持前缀索引的,有两种加索引的方式: mysql> alter原创 2020-08-06 13:52:25 · 137 阅读 · 0 评论 -
MYSQL学习笔记---选择索引
在不同的场景下,是选择普通索引还是唯一索引呢? 假设有一个市民系统,业务层面已经保证了身份证号是唯一的,有下面的查询: select name from CUser where id_card = 'xxxxxxxyyyyyyzzzzz'; 这个SQL语句肯定要考虑建索引。由于身份证号字段比较大,所以考虑是普通索引或者唯一索引。 从业务上已经保证身份证不会重复,所以从业务上来说都是正确的。 从查询和更新的性能来说呢? 查询过程 比如有下面的语句: select id from T where k=5 这原创 2020-08-05 00:37:00 · 141 阅读 · 0 评论 -
MYSQL学习笔记---值到底是多少
建表和插入语句如下: mysql> CREATE TABLE `t` ( `id` int(11) NOT NULL, `k` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB; insert into t(id, k) values(1,1),(2,2); 启动的事务: A,B,C查到的值是? 首先,两种启动事务的方式: 1 begin/start transaction,没有直接启动事务,而是要到执行第一条快照读语句的原创 2020-08-04 20:18:37 · 134 阅读 · 0 评论 -
MYSQL学习笔记--行锁
MYISAM不支持行锁,INNODB支持行锁。从并法度来说INNODB要比MYISAM要大。这也是INNODB替代MYISAM的重要原因之一。 从两阶段锁说起 下面的情况会发生什么? 事务 B 的 update 语句会被阻塞,直到事务 A 执行 commit 之后,事务 B 才能继续执行。 那么就有一个结论:在 InnoDB 事务中,行锁是在需要的时候才加上的,但并不是不需要了就立刻释放,而是要等到事务结束时才释放。这个就是两阶段锁协议。 从这个可以得出:如果你的事务中需要锁多个行,要把最可能造成锁冲突、原创 2020-08-03 20:12:48 · 158 阅读 · 0 评论 -
MSQL学习笔记--锁
根据加锁的范围,MySQL 里面的锁大致可以分成全局锁、表级锁和行锁三类。 全局锁 全局锁就是把整个数据库的实例加锁。命令是 Flush tables with read lock (FTWRL)。 数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新类事务的提交语句都会被阻塞。 主要的作用就是做全库逻辑备份,也就是把整库每个表都 select 出来存成文本。 会出现很危险的问题: 1 如果你在主库上备份,那么在备份期间都不能执行更新,业务基本上就得停摆; 2 如果你在从库上备份,那么原创 2020-08-03 19:43:08 · 164 阅读 · 0 评论 -
MYSQL学习笔记--索引
索引的出现其实就是为了提高数据查询的效率,就像书的目录一样。 比如你突然想复习哪个知识点,翻一番目录就大概知道在哪个章节,然后翻倒那一个章节就很快就找到了你要的内容。 常见的数据库索引模型 三种简单也比较常见的模型: 哈希表 哈希表是key-value的存储数据的结构。通过哈希函数把key计算一个确定的位置,然后把key对应的value放在数组对应的位置里面。这种做法可能会产生冲突,解决方法就是在每个值的后面跟一个链表。哈希表这种结构适用于只有等值查询的场景,比如 Memcached 及其他一些 NoSQL原创 2020-07-31 13:53:43 · 78 阅读 · 0 评论 -
MYSQL学习笔记--事务隔离
事务的属性包括ACID。 Atomicity:原子性。一个事务的全部操作要么全部成功,要么全部失败回滚。比如转帐,从A扣100,B增加100,这两个操作要么全部成功,如果有一个失败就要回滚,不然就会出现A扣了100,B却没有加上100的情况。 Consistency: 一致性。 即在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。还是拿转账为例A 有 500 元,B 有 300 元,如果在一个事务里 A 成功转给 B50 元,那么不管并发多少,不管发生什么,只要事务执行成功了,那么最后 A 账户一原创 2020-07-30 14:04:45 · 130 阅读 · 0 评论 -
MYSQL学习笔记--SQL更新语句的执行
MYSQL更新语句是这样子的: mysql> update T set c=c+1 where ID=2; 更新语句跟查询语句走的流程是一样的: 跟查询一样,连接器----》查询缓存—》分析器----》优化器—》执行器。 与查询不同的地方,多了两个日志模块redolog和binlog. redo log 由于每次操作如果每次对数据库的操作都写入磁盘进行持久化的,整个操作的IO成本,查找成本都很高。所以MYSQL设计者就用了WAL技术(Write-Ahead Logging).原理就是先写日志,在不原创 2020-07-29 20:02:18 · 135 阅读 · 0 评论 -
MYSQL学习笔记--SQL查询语句的执行
当我门在MYSQL执行: mysql> select * from T where ID=10; 这条SQL语句从T表查询了ID=10的结果,但是具体MYSQL做了什么操作呢? 首先是基础架构示意图: 分为两个部分: 1 SERVER层:包括MYSQL大多数核心服务功能,内置函数,跨存储引擎的功能,连接器、查询缓存、分析器、优化器、执行器等。 2 存储引擎层:负责数据的存储和提取,插件式,默认INNODB 整个SQL语句的执行流程: 1 连接器 ...原创 2020-07-29 12:44:25 · 80 阅读 · 0 评论