mysql
查询语句过程
连接器
查询缓存
分析器
优化器
执行器
Mysql8.0删除查询缓存
redo log 是innodb特有的 binlog 是mysql server层实现
redo log 是物理日志 binlog 是逻辑日志
redo log 是循环写 binlog是追加
Redo log 和 binlog 两阶段提交
Innodb B+树模型 主键索引(聚簇索引) 非主键索引
非主键索引叶子结点是主键的值 所以主键长度越小越好
读未提交
读提交 每个SQL执行时创建视图
可重复读 事务创建的时候创建视图
窜行化
DML 增删改数据
DDL 修改表结构
MDL:不需要显式使用,在访问一个表的时候会被自动加上。
MDL的作用:保证读写的正确性。
在对一个表做增删改查操作的时候,加MDL读锁;当要对表做结构变更操作的时候,加MDL写锁。
读锁之间不互斥。读写锁之间,写锁之间是互斥的,用来保证变更表结构操作的安全性。
MDL 会直到事务提交才会释放,在做表结构变更的时候,一定要小心不要导致锁住线上查询和更新。
innodb_deadlock_detect=on 主动死锁检测 但是消耗CPU 在更新热点数据时容易出问题
普通索引和唯一索引对查询性能上是一样的。在更新上普通索引效率更高。
Delete 不用的数据 表空间是不会减少的,因为只是将数据页标记为可复用。可以重建表解决。重建表之后空间占用更大了,因为innodb把每个页都预留了1/16,或者刚好有DML在执行。
select city, name, age from a order by age desc limit 10
order by 全字段排序 在soft_buffer 放入 符合条件的city name age 然后再排序 soft_buffer_size不够的时候 会用到临时文件
rowid排序 在soft_buffer放入 id age 排序后 再返回表 根据id 查 city name age。
max_length_for_sort_data=16 当city name age超过16长度时 使用rowid排序
tmp_table_size 内存临时表的大小 默认16M 如果超过了 就会变成磁盘临时表
Left join的时候 两张表 的字段 自负集如果不一样 不会用上索引 因为在mysql 内部 会加上函数操作 进行字符集转换
两种方法解决 修改表结构 如果表结构不好修改 修改sql语句 using utf8
Select blocking_pid from sys.schema_table_lock_waits;找出阻塞的process id
select * from sys.innodb_lock_waits where locaked_table = ‘test’.’t’
简单查询很慢 表锁 行锁 一致性读(如果在事务过程中数据变化很多次 需要从redo log 里 往回读 所以很慢)
更新数据都是先读后写,这个读,只能读当前值,称为当前读。
Select如果枷锁,也是当前读。lock in share mode 或 for update
innodb_thread_concurrency 并发线程数量 并发查询数量 不是并发连接