建立索引,如何监控索引使用情况用explain,进而了解当前sql语句是不是优化过的语句
students有三个索引
现在想给姓名和age建立复合索引
把表上的indexname索引删除了
就少了一个索引
把age也删除了
创建复合索引
索引名是一样的
seq_in_index索引中排第几个
这两种都没有利用索引的
精确匹配利用到了索引
有可能会利用都索引,但是实际上没有用到
age是复合索引第二个字段,没有利用索引
这样写就利用到了主键索引
name=可以利用索引
还有唯一键索引
现在有三个索引,主键索引,和普通索引
想要创建一个唯一键索引,给name上面
创建唯一键索引
explain是来详细查看命令执行结果
id可以判断有几个select语句
subquery 子查询,primary最外面的select
如果要使用type功能还需要专门设置下
在老版本上就支持,较新的版本需要改下设置,默认看不见
这上面就有union的提示
这样类型就是不是ALL了全表扫描
key就属于有多条路径,选择最终优化的路径
整数int要占4个字节,32位
建立只有两个字符长度的students索引
只取前两个字符
可能用的索引,但是实际没用上
现在用的复合索引
把相关索引删除了,就用到了ref
长度8个字节
取2个字符,就是2个utf8,2个4个字符=8,unique的编码占得比较多
慢查询就是要跟着系统中哪个命令达到符合慢的条件的,比如10秒,超过10秒就认为太慢了
将来就可以把所有超过10秒的语句存起来,方便你查看,来具体针对哪条命令进行优化
具体怎么实现并发访问,什么时候读锁,什么时候写锁,锁的力度都有可能和存储引擎密切相关,存储引擎决定了你是用哪个级别的锁
加锁的方式
read读锁,只读不可写,write,排他锁,你在访问,其他人就访问不了
对students加个读锁
读可以读,但是改不能改
别的终端显示就是一直卡着
所以加读锁就意味着不论任何人,都不能写,包括自己
一解锁就执行了
加上写锁,自己能读
别人也能读
之前的应该是缓存,换一条命令就不能查询了
自己读也行,但是别人读就不行
释放锁就能读了
加锁的目的就是给一个人访问的时候,不让其他人也去访问。
清除查询缓存,再加上写锁,看是否能查询成功
就查不了了,之前别人能查是因为有缓存
结合锁就涉及到事务并发的问题
ACID特性
undo,取消撤销,如果有2-6操作,但是在4中间断电了
这时候内存数据丢了,硬盘上的数据还是原来的数据
系统会把之前的操作undo撤销,回滚,磁盘数据就还是1,没有改变
可能还有另外一种情况,之前的事务结束了,是一个完整的事务,但是不一定事务结束了,就要把数据立即写到磁盘里
因为什么时候写是根据系统是否空闲来决定的
所以就可能出现另外一个问题,出现另外一个人修改数据,567,最终是要改成9 的,但是中间突然停电,
234是完整事务,说明已经做完了,所以应该把234事务重新执行一遍redo、567是个不完整事务就需要撤销undo
**,初始化数据库 initial db state
开始一个事务 start transaction
增删改,查询不算一个事务部分,只有增删改才会记录在事务日志里
commit提交 数据库状态就发生变化
rollback 回滚
**
2019/04/16 数据库性能优化和事务
最新推荐文章于 2021-10-29 19:25:58 发布