1:sql语句的执行顺序
先执行from,组装来自不同数据源的数据。
在where字句基于指定的条件对记录进行筛选。
在group by 字句将数据划分为多个分组。
使用聚合函数计算。
使用having字句进行筛选分组。
计算所有表达式。
select字段
使用order by进行结果排序。
2:MYSQL的事务
事务的基本要求(ACID)
原子性:事务要么全部执行成功,要么全部失败,如果事务执行失败,则会回归到执行事务
之前的状态。就如同化学中的原子,是物质构成的基本单位。
一致性:事务在开始和结束后,数据机构不能被破坏,比如以转账为例,a向b转了钱,不能
够a的钱少了,但b的钱没有增加。
隔离性:同一时间内,事务只能允许一条事务请求同一条数据,不同的事务之间不能互相干
扰,比如a在向银行卡里取钱的时候,b不能从这张银行卡转账。
持久性:事务在完成之后,事务对数据库的操作将更新到数据库里,不能够回滚。
3:并发时存在的问题:
脏读:用户a读取了用户b提交的事务,然后用户b回滚了事务,则用户a就出现了脏读。
不可重复读:事务a多次读取一条数据,但事务b在事务a读取的过程中,是数据进行了修改并
提交,导致事务a多次读取的数据不一样,结果不一致。
幻读:比如用户a将成绩表成绩都改为了abcd不同的档次,这时用户b将一条具体的成绩插入
进来,导致a在修改完之后发现了一条具体的数据,就跟出现幻觉一样。(不可重复读的和幻 读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只 需锁住满足条件的行,解决幻读需要锁表)
4:MYSQL事务隔离级别
读未提交:最低级,可能出现脏读,不可重复读,幻读
读已提交:高于前面,不会出现脏读,但会出现不可重复读和幻读
可重复度:不会出现脏读,不可重复读,但会出现幻读
串行化:都不会出现,但效率最低一般不会使用
5:描述数据库的innoDb:
innodb是主要面向在线事务处理方面的应用,他使用了mvcc机制,用于解决数据读写的并发
问题,在mvcc中,在执行事务。读取到的是当前事务的快照版本,事务对数据的修改都会创
建新的版本,因此是读写之前不堵塞的。修改数据的时候,他的版本会不断增加,并且在提
交前,其他事务无法读到他提交后的数据。
6 :乐观锁和悲观锁的怎么实现:
悲观锁:select.......fro update是mysql提供的实现悲观锁的形势。
比如数据select price from item where id = 100 for update,当执行该条sql语句的时候,
id=100的数据会被执行行所,悲观锁顾名思义就是保持一颗悲观的状态,认为谁都要更改自
的数据,如果这时执行select price from item where id=100这条sql语句必须要等到前面的sql
语句执行完毕,因此在使用悲观锁的时候要走索引不能全局扫描,不然整张表都会被锁住。
乐观锁:顾名思义,保持乐观的状态,认为你的事务都是不冲突的,所以只有在你提交的时
候才会对数据进行检测,如果有错误就返回错误信息,让用户进行决策。在乐观锁的时候,
利用version机制是乐观锁最常用的实现方式,数据每修改一次,version就+1,在查询的时候
将version一起查出,在与第一次的version进行对比,如果是一致的就更新,否则返回失败。
7:mysql的sql怎么优化:
1:避免使用select * 进行查询,应该明确的指定对应的列。
2:避免使用子查询,因为myql会对子查询进行缓存,如果涉及到多次查询,缓存可能失效。
3:避免使用模糊查询,因为无法使用索引,会进行全表扫描。
4:在表中添加索引,索引可以加快数据的检索,提高查询效率,但过多的索引会增加写操作
的成本,也需要权衡索引数量和查询性能。
5:避免在where字句中使用函数,算术符等,这样myql会放弃使用索引,进行全表扫描。
6:尽量避免使用临时表,会消耗大量的系统资源。
7:将常熟或者具有唯一性的列作为where中的第一列,这样可以使用b_tree索引的特性,快
速查找。
mysql优化(详细):
单表查询:
不要再索引列上进行函数,计算等操作,会导致索引失效,进行全表扫描
不要进行模糊查询,索引会失效进行全表扫描
mysql在使用!=或< > 会导致索引无法使用
is not null也无法使用索引,但is null 可以使用索引
字符串不加单引号,会使索引失效
多表联合查询:
保证被驱动表的join字段已被索引
left/right join时,用小表做驱动表,大表做被驱动表。
使用 inner join时,mysql会自动吧小结果表作为驱动表。
子查询尽量不要放在被驱动表,有可能用不到索引。
能够直接关联的就直接关联,不要用子查询。
子查询优化:尽量不要使用not in 或者 not exists
排序优化:order by 字句,尽量使用index方式排序,避免使用fileSort进行排序。