如何查看 sql 的索引使用情况
explain select * from xxx where xxx
索引失效的情况
- 索引选择性太差(搜索出来结果/总量> 1/4 )
- <>/not in 无法使用索引
- is null 会使用索引 is not null 不会使用索引
- where 子句跳过左侧索引列,直接查询右侧索引字段(联合索引时,一定要按从左到右的时候,没有按照从左到右的顺序)
- 对索引使用计算或者使用函数
--- 未完待续
explain select * from xxx where xxx
--- 未完待续
行锁、表锁
乐观锁、悲观锁
共享锁、排他锁
读锁(read lock),也叫共享锁(shared lock)
针对同一份数据,多个读操作可以同时进行而不会互相影响(select)
写锁(write lock),也叫排他锁(exclusive lock)
当前操作没完成之前,会阻塞其它读和写操作(update、insert、delete)
#表锁的读锁和写锁
lock table tablename read;
lock table tablename write;
# 行锁的读锁和写锁
lock in share mode;
for update
索引重新统计
analyze table tablename
优化表空间,释放表结构 #会锁表
optimeize table tablename
show status # 获取 mysql 运行的数据
show variables # 获取 mysql 的配置
一线数据库工程师带你深入理解mysql
mysql 实战45讲
mysql 高级架构师视频
从0开始带你成为mysql实战优化大师
性能调优-mysql深度剖析-诸葛
分析器
优化器
执行器
各种隔离级别一览:
1. 读未提交: 事务直接提交,不会创建视图
2. 读提交: 会创建视图
3. 可重复提交:事务启动的时候就会创建视图
4. 串行化:直接加锁,不会
查看当前mysql的事务的执行级别:show variables like 'TRANSACTION_isolation'
读表锁是都只能读不能写,
写表锁是只有锁表的事务可以写不可以读
以上,执行锁操作的客户端是无法读取其它表的,
加了写锁的表,其它客户端无法读写,本客户端也无法读
加了读锁的表,都可以读,但是都无法写
300ms
为了避免查询回表,应尽量使用索引覆盖。例如使用select id from a where name =b
在 mysql8.0.26 测试可知:一个汉字=3个字母=3个数字
show status like '%%' 和 show variables like '%%'
redolog的理解
https://blog.51cto.com/u_15274085/2918514
redolog的理解
https://blog.51cto.com/MageByte/2934214?b=totalstatistic
几种 mysql log 的总结
https://www.cnblogs.com/wy123/p/8365234.html
生产环境下 mysql 的配置
https://blog.csdn.net/miyatang/article/details/60875194
mysql char(n) 汉字的说明
https://www.cnblogs.com/zhuyeshen/p/11642211.html
mysql 汉字说明
https://www.cnblogs.com/jelly12345/p/14987259.html
mysql 为什么不建议使用 null
https://segmentfault.com/a/1190000039774659