程序员做项目的网站,天猫做网站,做网站的步骤,茶山做网站1. SQL语句如何开始执行#xff1f; MySQL分为Server和存储引擎两部分#xff1a; Server层包含连接器、存储缓存、分析器、执行器等#xff0c;以及所有的内置函数#xff08;事件、日期#xff09;等等#xff0c;还有视图、触发器。 存储引擎是负责数据的存储和提取 MySQL分为Server和存储引擎两部分 Server层包含连接器、存储缓存、分析器、执行器等以及所有的内置函数事件、日期等等还有视图、触发器。 存储引擎是负责数据的存储和提取我们有InnoDB、MyISAM等等。MySQL建表默认InnoDB但是也可以指定。
如何去查询连接器先建立 TCP连接查询你的权限此次连接你的权限不会被别人所更改。执行select语句先查缓存没有命中就继续。大多数情况下缓存比较麻烦最好不要用指定缓存查询。8.0之后就没缓存功能了分析器。分析器用来检查SQL语法并语法分析。优化器。MySQL内部对语句判断如何选择索引。执行器。判断你有权限继续调用InnoDB返回结果。
2.日志系统
更新流程 redologbinlog redolog WAL技术先写日志不往前去更改4个盘循环的写。 redolog是存储引擎层的日志。
binlog是server层日志追加写。 两阶段提交 让两份日志之间的逻辑一致。
3. 事务隔离 SQL标准的事务隔离级别包括读未提交read uncommitted、 读提交read committed、可重复读repeatable read和串行化serializable 。 读未提交是指一个事务还没提交时它做的变更就能被别的事务看到。 读提交是指一个事务提交之后它做的变更才会被其他事务看到。 可重复读是指一个事务执行过程中看到的数据总是跟这个事务在启动时看到的数据是一 致的。当然在可重复读隔离级别下未提交变更对其他事务也是不可见的。 串行化顾名思义是对于同一行记录“写”会加“写锁”“读”会加“读锁”。当出现读写锁冲突 的时候后访问的事务必须等前一个事务执行完成才能继续执行。 多版本的并发控制(MVCC)控制了回滚。
4.索引上
有序数组 哈希只能用于静态存储引擎写入了就不能去修改。二叉树比较慢所以InnoDB用B树。主键是一棵B树N个叉只在叶子节点存所有数据的值也被叫聚簇索引。非主键索引的叶子是主键值所以需要查找到主键值回表去主键B树去查值如果说这个索引是个联合索引又恰好你只需要这些值那就不用回表叫覆盖索引。用自增主键可以防止页分裂的降低效率最左前缀
5. 索引下
覆盖索引只需要查ID的值而ID的值已经在k索引树上了因此可以直接提供查询结果不需要回表。最左前缀即当你创建了一个联合索引该索引的任何最左前缀都可以用于查询。 比如当你有一个联合索引 (col1, col2, col3) 该索引的所有前缀为 (col1) 、 (col1, col2) 、 (col1, col2, col3) 包含这些列的所有查询都会使用该索引进行查询。索引下推组合索引满足最左匹配但是遇到非等值判断时匹配停止。name like ‘陈%’ 不是等值匹配所以 age 20 这里就用不上 (name,age) 组合索引了。如果没有索引下推组合索引只能用到 nameage 的判定就需要回表才能做了。5.6之后有了索引下推age 20 可以直接在组合索引里判定。
6.全局锁和表锁
MySQL M 里面的锁大致可以分成全局锁、表级锁和行锁三类
全局锁做全库逻辑备份保证备份时是唯一视图MySQL里是mysqldump参数single-transaction是做这个的MVCC也能保证数据正常更新。别的引擎用FTWRL表级锁lock tables面积太大。MySQL引入MDL增删改查时加读锁更改表结构加写锁。读锁不互斥写互斥就是阻塞。长事务不行不提交占用MDL阻塞。解决长事务kill或者设定等待时间指定DDL NOWIT/ WAIT N. ALTER TABLE tbl_name NOWAIT add column … ALTER TABLE tbl_name WAIT N add column …
7.行锁
两阶段锁在InnoDB事务中行锁是在需要的时候才加上的但并不是不需要了就立刻释放而是要等到事务结束Commit时才释放。这个就是两阶段锁协议。更改操作顺序共同操作的放后面减少事务之间的等待。影院买票插日志改顾客余额更改影院余额放最后面死锁和死锁检测死锁是并发中循环资源依赖都在都等别人释放导致都无限等待。A等待B放id2B等A释放id1解决死锁 设置超时时间一般不用。主动死锁检测解决热点更新的问题。1000个并发线程更改同一行死锁检测是100万级。控制并发度更改电影院账户为10个分流。
8. 事务如何隔离
视图概念一个用查询语句定义的虚拟表调用的时候执行查询语句生成结果。InnoDB实现MVCC时用到的一致性视图consistent read view支持RC和RR隔离的实现。每一行数据有多个由InnoDB发放的Transaction idMVCC视图可以分为已提交事务未提交事务集合未开始事务。分别是可见部分可见不可见。任务视图三种情况 版本未提交不可见版本已提交视图创建后提交不可见版本已提交视图创建前提交可见 更新数据都是先读后写这个读只能读当前值成为“当前读”。可重复读一致性读核心就是唯一视图更新数据只能用当前读如果要更新数据被别人占用了没提交就锁住了称为行锁。
9. 普通索引和唯一索引
change buffer 是InnoDB的内存操作merge是得到新结果。唯一索引要判断需要加载入内存已经在内存中的用内存更快。所以唯一索引不需要change buffer如果插入值有冲突 普通索引会将更新记录在change buffer后面merge后会持久化到磁盘。唯一索引将数据页读入内存判断没有冲突插入后语句结束。读入内存需要大量IOchange buffer减少这个操作 写多读少场景change buffer的收益最大。账单类日志类。反之是副作用。尽量选择普通索引配置change buffer比较好用redo log WAL 写操作如果在内存中数据直接改没在就change buffer记录中更改最后都写入redolog中。读操作在内存中直接返回不在的先读入内存再根据buffer更改生成正确版本返回。 redo log节省随机写磁盘的IO消耗change buffer节省随机读磁盘的消耗。
10. MySQL为什么有时候会选错索引
删完再插入再查时间变长索引选择错误。是因为优化器选错索引。选择索引错误可以用analyze table t命令来重新统计索引信息。矫正选择索引错误 force index来强制选择索引在优化器失效时可以起到矫正作用。修改SQL语句order by b limit 1 - order by b,a limit 1。a 1000行也纳入排序优化器知道a少就索引a了新建合适的索引