MYSQL试题

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进行排序。

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值