mysql高级记录

1. mysql分层

1.连接层 
	提供与客户端的链接
2.服务层
	提供用户使用的接口
 	提供sql优化器 mysql query Optimizer
3.引擎层
	提供数据的存储方式(innodb myisam)
4.存储层
	存储数据

2.myisam引擎和innodb引擎的区别

	myisam使用的是非聚簇索引,表锁 ,写优先,性能优先,不支持事务,适合做非高并发,读任务
	innodb使用的是聚簇索引,行锁,语句的执行是由获得行锁的顺序决定的,事务优先,支持事务,适合做高并发情况

3.mysql机器读取顺序

from确定表 
接下来搞连接 先 on 在join 
连接完成后筛选 where
筛选后 就形成了一张成品表,在进行分组groupby 后在筛选 having
最后排序 order by ,然后截取 limit

4.mysql锁

读锁(共享锁),写锁(排他锁),每一种锁在粒度划分上又分为行锁和表锁

线程 :a,b   
读锁:a在给某条记录加读锁时,也就是select某条记录时,a不能读写其他记录,不能写自己锁定的记录,b可以读写其他记录,可以读被a锁定的记录,而不可以写
写锁:a在给某条记录加写锁时,也就是updata,delect。。。某条记录时,a不能读写其他记录,可以读写自己锁定的记录,b可以读写其他记录,不可以读写被a锁定的记录
	 
表锁:指a锁定一张记录时(比如select某表的记录,或updata,delect。。。某条记录时),其他任何线程无法操作(读锁的话,这里操作代表写,写锁则表示写和读)被a锁定的那条记录所属的整张表,即使a和其他线程操作的是一张表中的不同记录
行锁:指a在锁定一张记录时(。。。)其他任何线程无法操作那条记录,对表无要求
间隙锁: 指索引不连续时可能意外的锁定其他操作
锁升级: 指不规范使用查询导致innodb行锁升级为表锁
如何锁定一行:myisam不行没有行锁,在innodb引擎中 sql语句后加for updata(myisam引擎sel语句自动加读锁,up,del,in自动加写锁,而innodb引擎sel语句默认不加锁,up,de,ins自动加写锁,所以需要sel语句加锁,需要添加以下规则:
    共享锁(S):SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE
    排他锁(X):SELECT * FROM table_name WHERE ... FOR UPDATE)
查询锁的状态:show status like 'table%';

5.事务

acid:原子,一致,隔离,持久	
问题:跟新丢失,脏读,不可重复读,幻读
解决:读未提交,不可重复读,可重复读,串行化

6. 索引

1.创建索引
	create index haha on teacher (name)
	alter table teacher add index haha (name) 
2.显示索引
	show index from  teacher 
3.删除索引
	drop index  haha on teacher 
	alter table teacher drop index haha 
4.索引结构
	btree和hash 
	btree:内部使用b+树来进行索引(为什么不用b树?每个叶子节点是固定的,如果去掉数据就可以存放更多的索引,同样的数据可以将树变得更矮),这里又分为不同的实现,
		当第四层是btree第三层是innodb的时候,b+树索引将会在叶子节点处存放数据实体和索引的组合(如果是以非id为索引的时候,在叶子节点会存放指向以id为索引时叶子节点存放数据的指针,即用主键索引来组织整张表中的所有数据),如果你不建主键索引,mysql会找你的列中哪个全部是不一样的,将它设置为主键,如果都没有,它将帮你额外建一个列作为主键列,推荐使用自增整数主键,因为在寻值过程涉及很多比较,使用整数比较节省性能,而且在构建索引的时候,因为叶子节点都是递增的,向其中插入的时候如果是有序会直接延续,如果是无序的话还需要重整一下叶子结点的平衡
		当第四层是btree第三层是myisam时,b+树将会在叶子节点存放索引和指向存在外存数据的指针,不再存放数据实体,(这也是聚集索引和非聚集索引的区别)
	hash:内部使用hash实现,查询极快,但不支持包括范围查询以内的所有涉及排序的查询

7.优化

1.尽量全值匹配
2.最佳左前缀
3.不要在索引列上加计算
4.尽量使用覆盖索引
5.在使用不等与的时候会导致全表扫描
6.is null和is not null也无法使用索引
7.不要写范围,写范围后索引列右边的会失效
8.like如果使用‘test%’右边的会失效,其他全部失效,如果想要生效,需要使select的值全部在索引上
9.字符串不加单引号死罪
10.少用or

猜你喜欢

转载自blog.csdn.net/lioncatch/article/details/107630000