前言对于sql优化,必须掌握的知识:MySQL:(一)索引底层原理与实现 、MySQL:(二)存储引擎
一、插入数据批量插入&手动事务如果插入的数据是-这个范围,可以使用数据批量插入的方式。那如果是几万条数据呢?那就使用多条数据批量插入语句。如果使用单条插入操作会多次建立与数据库的连接,性能肯定是比一次性连接的批量插入低的。
另外,InnoDB使用的是自动提交事务,每插入一次就自动进行事务的开启和关闭,因此可以手动控制事务,避免事务多次的开启和提交。
最后是主键顺序的问题。InnoDB使用的是B+树和双向链表,而B+树众所周知就是查的快,插入难,会导致页分裂等等问题。B+树如果按照主键顺序进行插入效率会高很多。
主键顺序可参考:
文章:MySQL:(一)索引底层原理与实现 中第四节:InnoDB B+树存储数据结构。
本篇文章第二节
总结一下:
批量插入
手动提交事务
主键按顺序进行插入
load指令ok,下一模块。
如果插入的数据更大,数据来到了几百万的级别,那么使用insert的性能就不高了。
在MySQL中要涉及大量数据插入时,我们选择 ...
为什么要进行分库分表
来解释一下IO瓶颈:
在介绍innodb存储引擎MySQL:(二)存储引擎 | 颓废市民黄先生 (rengoku.top)的时候,曾经说过,内存架构中大部分的组件都分配给了缓存。如果内存不足,缓存就不够,那么就要使用后台线程和磁盘进行io,这样效率就会低
拆分策略
垂直拆分
垂直分表:局限于单个数据库内部,不涉及跨数据库操作。
垂直分库:跨越多个数据库,甚至可能跨越不同的服务器,涉及跨数据库的数据访问和管理。
水平拆分和垂直拆分一样,水平分库会涉及跨数据库,而水平分表不跨数据库。
MyCatmycat详细介绍及实战-CSDN博客
mycat实现分库分表,读写分离。
前言MVCC是面试重灾区,网上的内容我发现并不全面,只有生搬硬套下来的原理却不解释过程,让我看的云里雾里。我写这篇MVCC的内容目的是能更好了理解MVCC如何实现,结合一些八股的内容和实际的案例进行介绍,全程干货。
一、什么是MVCC多版本并发控制(MVCCD;Multi-Version Concurrency Control),是一种用来解决读 - 写冲突的无锁并发控制。也就是为事务分配单向增长的时间戳,为每个修改保存一个版本。版本与事务时间戳关联,读操作只读该事务开始前的数据库的快照(复制了一份数据)。mvcc解决的就是读写时的线程安全问题,线程不用去争抢读写锁(读写锁可参考:Java多线程:三、多线程锁、java锁的实现 | 颓废市民黄先生 (rengoku.top))。
说到读写冲突和多线程并发控制,肯定也会涉及事务的隔离级别,即读未提交(可能脏读),读已提交(不可重复读),可重复读(可能幻读)。
MVCC所提到的读是快照读,也就是普通的select语句。快照读在读写时不用加锁,不过可能会读到历史数据。
还有一种读取数据的方式是当前读,是一种悲观锁的操作。它会对当前 ...
MySQL中的锁,按照锁的粒度分,分为:
全局锁:锁定数据库中所有表
表级锁:每次操作锁整张表
行级锁:每次操作锁住对应行数据
一、全局锁
mysqldump相信大家都听说过,这是用来进行数据库备份的工具,除此以外也可以采用数据库主从复制机制进行数据库备份,这同时也是异地容灾、备份等内容。
数据库备份操作:
# 加锁操作flush tables with read lock;# 数据备份mysqldump -uroot -p databases > database.sql# 加端口的数据备份mysqldump -h..xx.xx -uroot -p databases > database.sql# 解锁操作unlock tables;
这里附上一篇flush操作的博客,用的是博客中的第条:MySQL flush命令详解-CSDN博客
FLUSH TABLES: 关闭所有表并清空表缓存(如查询缓存),或者指定特定表进行刷新。这对于解决锁问题、确保数据一致性或在没有重启MySQL服务的情况下应用表结构更改很有用 ...
一、存储引擎. InnoDB在MySQL现版本,默认的存储引擎是InnoDB,这个不用多说了,另外常见的还有MyISAM,Memory,CSV等,这里就InnoDB进行介绍。
总结成三个词语就是:事务,外键,行级锁。
. idb文件-表空间文件
*.frm:与表相关的元数据信息都存放在frm文件,包括表结构的定义信息等
*.ibd:InnoDB DATA,表数据,表结构和索引的文件。该表的索引(B+树)的每个非叶子节点存储索引,叶子节点存储索引和索引对应的数据。
要是想查看这个表,直接打开的话是不行的,因为都是二进制文件
可以通过ibdsdi xx.ibd命令来得到json格式的表数据
. 逻辑存储结构
二、架构. 内存架构
buffer pool处理主键索引、二级索引,而change buffer是基于为了减少磁盘io的目的,优化了二级索引处理。
利用哈希索引去做查操作非常的快,而使用b+树的效率和使用hash索引相比就没有那么高,因此在innodb中优化了对buffer pool的查询。如果hash索引更快则建立hash索引,和之前学的一样,和b+树都是一种 ...
一、 什么是索引?索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址,可以大大加快查询的速度,使用索引后可以不用扫描全表来定位某行的数据,而是先通过索引表找到该行数据对应的物理地址然后访问相应的数据。索引的作用类似于书的目录,可以根据目录中的页码快速找到所需的内容。
. 索引概述(了解)当数据保存在磁盘类存储介质上时,它是作为数据块存放。这些数据块是被当作一个整体来访问的,这样可以保证操作的原子性。硬盘数据块存储结构类似于链表,都包含数据部分,以及一个指向下一个节点(或数据块)的指针,不需要连续存储。
记录集只能在某个关键字段上进行排序,所以如果需要在一个无序字段上进行搜索,就要执行一个线性搜索(Linear Search)的过程,平均需要访问 N; 的数据块,N 是表示所占据的数据块数目。如果这个字段是一个非主键字段(也就是说,不包含唯一的访问入口), 那么需要在 N 个数据块上搜索整个表格空间。
但是对于一个有序字段,可以运用二分查找(BinarySearch),这样只需要访问 log(N)的数据块。这就是为什么数据表使用索引后性能 ...