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%';
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实现,查询极快,但不支持包括范围查询以内的所有涉及排序的查询