A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 执迷不悟 于 2020-3-18 11:37 编辑

                                                                mysql面试题



1.事务的基本特征
       原子性(atomicity):一个事务必须视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性。
      一致性(consistency):数据库总数从一个一致性的状态转换到另一个一致性的状态。
      隔离性(isolation):一个事务所做的修改在最终提交以前,对其他事务是不可见的。
      持久性(durability):一旦事务提交,则其所做的修改就会永久保存到数据库中。此时即使系统崩溃,修改的数据也不会丢失。
2.事务的隔离级别,mysql默认的隔离级别是什么?
      读未提交(Read uncommitted),一个事务可以读取另一个未提交事务的数据,最低级别,任何情况都无法保证。
      读已提交(Read committed),一个事务要等另一个事务提交后才能读取数据,可避免脏读的发生。
      可重复读(Repeatable read),就是在开始读取数据(事务开启)时,不再允许修改操作,可避免脏读、不可重复读的发生。
      串行(Serializable),是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。Mysql的默认隔离级别是Repeatable read。
3.说一说脏读、不可重复读、幻读
      脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据;
      不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果因此本事务先后两次读到的数据结果会不一致;
      幻读:幻读解决了不重复读,保证了同一个事务里,查询的结果都是事务开始时的状态(一致性);
4、MySQL主要的索引类型
      普通索引:是最基本的索引,它没有任何限制;
      唯一索引:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一;
      主键索引:是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值;
      组合索引:指多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用组合索引时遵循最左前缀集合;最左原则
      全文索引:主要用来查找文本中的关键字,而不是直接与索引中的值相比较,mysql中MyISAM支持全文索引而InnoDB不支持(5.6之后的mysql中,InnoDB引擎也支持全文索引);

5.数据库三大范式
      第一范式:数据库表中的字段都是单一属性的,不可再分(保持数据的原子性);
      第二范式:第二范式必须符合第一范式,非主属性必须完全依赖于主键。
      第三范式:在满足第二范式的基础上,在实体中不存在其他实体中的非主键属性,传递函数依赖于主键属性,确保数据表中的每一列数据都和主键直接相关,而不能间接相关(表中字段[非主键]不存在对主键的传递依赖)

6.sql语句分类:
    DDl,DML,DQL,DCL

7.索引的作用?和它的优点缺点是什么?
    提高查询效率,
    优点: 查询效率高, 降低数据IO成本, 降低数据排序CPU消耗
    缺点: 占用磁盘空间, 新增,删除, 修改----> 慢, 因为需要修改索引

8.说几个mysql中你常用的函数
    limit、order by、between、group by;

9. 使用like 'a%' 、like'%a'、like'%a%'查询时是否会使用索引
    'a%'会,其他两个不会

mysql 优化为什么要优化 ?
        在少量数据的情况下,一般不会涉及到性能问题,当我们数据量变多,达到几百万上千万时候,会明显感觉到一些复杂查询执行效率缓慢,一条sql可能需要执行好几秒,为了用户体验的良好以及系统运行的流畅,我们需要进行sql优化,使我们的程序执行更快
优化由谁参与
        在进行数据库优化时,应由数据库管理员、业务部门代表、应用程序架构师、应用程序设计人员、应用程序开发人员、硬件及系统管理员、存储管理员等,业务相关人员共同参与。
优化选择
    1) 优化成本: 硬件>系统配置>数据库表结构>SQL及索引
    2) 优化效果: 硬件<系统配置<数据库表结构<sql及索引
sql语句优化
  • 避免使用 select * , 因为在执行过程中, 首先要把* 解析成字段,然后进行查询, 影响效率

       可以写成: select name from t where id=?;
  • 尽量避免在where 子句中使用 != 或 <> 操作符, 否则将导致mysql放弃使用索引, 而进行全表扫描
    如:
    select id from t where num !=null;
  • 下面的查询也将导致全表扫描:   
    select id from t where name like '%abc%'  
    select id from t where name like '%abc'  
    使用 select id from t where name like 'abc%'  索引不会失效
  • 尽量避免在 where 子句中对字段进行 null 值判断, 否则将有可能导致mysql放弃使用索引, 而进行全表扫描
    如:
    select id from t where num is not null
    可以在num 上设置默认值0, 确保表中num列没有null 出现, 然后查询语句可以这样写
    select id from t where num=0;
  • 尽量避免在 where子句中使用 or 来连接条件, 否则将有可能导致mysql放弃使用索引, 而进行全表扫描
    如:
    select id from t where num=10 or num=20
    可以这样写
    select id from t where num=10
    union all
    select id from t where num=20
  • in 和 not in 也要慎用, 否则有可能会导致全表扫描
    select id from t where num in(1,2,3)
    对于连续的数值, 我们能用between 就不需要使用 in 了
    select id from t where num between 1 and 3                                       
  • 尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。   
    这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。
    比如: sex 0, 1
  • 尽可能的使用 char 代替 varchar ,因为首先变长字段存储空间小,可以节省存储空间,  
    其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。
    Char:定长,效率高,一般用于固定长度的表单提交数据存储  ;例如:身份证号,手机号,电话,密码等
    varchar:不定长,效率偏低,节约空间






0 个回复

您需要登录后才可以回帖 登录 | 加入黑马