博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysql知识总结
阅读量:2066 次
发布时间:2019-04-29

本文共 3947 字,大约阅读时间需要 13 分钟。

  1. mysql explain是什么?有什么作用?描述下type

    1. mysql explain的作用是模拟Mysql优化器是如何执行SQL查询语句的,从而知道Mysql是如何处理用户的SQL语句,提高数据检索效率,降低数据库的IO成本。
    2. type全称是“join type”,“连接类型”或者“访问类型”,这样很容易给人一种错觉觉得必须需要俩个表以上才有连接类型。事实上这里的连接类型并非字面那样的狭隘,它更确切的说是一种数据库引擎查找表的一种方式。
  2. mysql中有哪几种锁?表锁、行锁、页锁区别?

    锁是计算机协调多个进程或线程并发访问某一资源的机制。锁保证数据并发访问的一致性、有效性;锁冲突也是影响数据库并发访问性能的一个重要因素。锁是Mysql在服务器层和存储引擎层的的并发控制。

    加锁是消耗资源的,锁的各种操作,包括获得锁、检测锁是否是否已解除、释放锁等。

    共享锁与排他锁

    • 共享锁(读锁):其他事务可以读,但不能写。
    • 排他锁(写锁) :其他事务不能读取,也不能写。

    粒度锁

    MySQL 不同的存储引擎支持不同的锁机制,所有的存储引擎都以自己的方式显现了锁机制,服务器层完全不了解存储引擎中的锁实现:

    • MyISAM 和 MEMORY 存储引擎采用的是表级锁(table-level locking)
    • BDB 存储引擎采用的是页面锁(page-level locking),但也支持表级锁
    • InnoDB 存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认情况下是采用行级锁。

    默认情况下,表锁和行锁都是自动获得的, 不需要额外的命令。

    但是在有的情况下, 用户需要明确地进行锁表或者进行事务的控制, 以便确保整个事务的完整性,这样就需要使用事务控制和锁定语句来完成。

    MySQL有三种锁的级别:

    • 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。

      • 这些存储引擎通过总是一次性同时获取所有需要的锁以及总是按相同的顺序获取表锁来避免死锁。
      • 表级锁更适合于以查询为主,并发用户少,只有少量按索引条件更新数据的应用,如Web 应用
    • 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。

      • 最大程度的支持并发,同时也带来了最大的锁开销。
      • 在 InnoDB 中,除单个 SQL 组成的事务外,
        锁是逐步获得的,这就决定了在 InnoDB 中发生死锁是可能的。
      • 行级锁只在存储引擎层实现,而Mysql服务器层没有实现。 行级锁更适合于有大量按索引条件并发更新少量不同数据,同时又有并发查询的应用,如一些在线事务处理(OLTP)系统
    • 页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。

  3. 悲观锁 乐观锁 的区别

    乐观锁

    乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,采取在写时先读出当前版本号,然后加锁操作(比较跟上一次的版本号,如果一样则更新),如果失败则要重复读-比较-写的操作。

    Java中的乐观锁基本都是通过CAS操作实现的,CAS 是一种更新的原子操作,比较当前值跟传入值是否一样,一样则更新,否则失败。

    悲观锁

    悲观锁是就是悲观思想,即认为写多,遇到并发写的可能性高,每次去拿数据的时候都认为别人会修改,所以每次在读写数据的时候都会上锁,这样别人想读写这个数据就会block直到拿到锁。

    Java中的悲观锁就是Synchronized,AQS框架下的锁则是先尝试cas乐观锁去获取锁,获取不到,才会转换为悲观锁,如 RetreenLock。

  4. 什么是索引?

    索引是一种特殊的数据库结构,由数据表中的一列或多列组合而成,可以用来快速查询数据表中有某一特定值的记录。

  5. 索引的种类有哪些,描述索引的优缺点?

    索引类型

    普通索引:仅加速查询

    唯一索引:加速查询 + 列值唯一(可以有null)

    主键索引:加速查询 + 列值唯一(不可以有null)+ 表中只有一个

    组合索引:多列值组成一个索引,专门用于组合搜索,其效率大于索引合并

    全文索引:对文本的内容进行分词,进行搜索

    ps.索引合并,使用多个单列索引组合搜索

    覆盖索引,select的数据列只用从索引中就能够取得,不必读取数据行,换句话说查询列要被所建的索引覆盖

    索引的优点:

    ① 建立索引的列可以保证行的唯一性,生成唯一的rowId

    ② 建立索引可以有效缩短数据的检索时间

    ③ 建立索引可以加快表与表之间的连接

    ④ 为用来排序或者是分组的字段添加索引可以加快分组和排序顺序

    索引的缺点:

    ① 创建索引和维护索引需要时间成本,这个成本随着数据量的增加而加大

    ② 创建索引和维护索引需要空间成本,每一条索引都要占据数据库的物理存储空间,数据量越大,占用空间也越大(数据表占据的是数据库的数据空间)

    ③ 会降低表的增删改的效率,因为每次增删改索引需要进行动态维护,导致时间变长

    什么情况下需要建立索引

    • 数据量大的,经常进行查询操作的表要建立索引。
    • 用于排序的字段可以添加索引,用于分组的字段应当视情况看是否需要添加索引。
    • 表与表连接用于多表联合查询的约束条件的字段应当建立索引。
  6. 设计索引的原则?(不少于4条)

    选择唯一性索引
    为经常需要排序、分组和联合操作的字段建立索引
    尽量使用前缀来索引
    尽量使用数据量少的索引
    删除不再使用或者很少使用的索引
    索引列不能参与计算
    为常作为查询条件的字段建立索引
    限制索引的数目
    尽量的扩展索引,不要新建索引
  7. 什么情况下索引会失效?(不少于4条)

    1、如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)

    注意:要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引

    2、对于多列索引,不是使用的第一部分,则不会使用索引

    3、like查询是以%开头,索引失效;以%结尾,索引有效

    4、如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引

    5、如果mysql估计使用全表扫描要比使用索引快,则不使用索引

  8. 数据库优化方案?(至少3条)

  9. 什么是存储过程?有什么优缺点?

    存储过程(Stored Procedure)是在大型中,一组为了完成特定功能的SQL 语句集,它存储在数据库中,一次后永久有效,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象。在数据量特别庞大的情况下利用存储过程能达到倍速的效率提升

    优点

    1. 运行速度:对于很简单的sql,存储过程没有什么优势。对于复杂的业务逻辑,因为在存储过程创建的时候,数据库已经对其进行了一次解析和优化。存储过程一旦执行,在内存中就会保留一份这个存储过程,这样下次再执行同样的存储过程时,可以从内存中直接调用,所以执行速度会比普通sql快。

    2. 减少网络传输:存储过程直接就在数据库服务器上跑,所有的数据访问都在数据库服务器内部进行,不需要传输数据到其它服务器,所以会减少一定的网络传输。但是在存储过程中没有多次数据交互,那么实际上网络传输量和直接sql是一样的。而且我们的应用服务器通常与数据库是在同一内网,大数据的访问的瓶颈会是硬盘的速度,而不是网速。

    3. 可维护性:的存储过程有些时候比程序更容易维护,这是因为可以实时更新DB端的存储过程。 有些bug,直接改存储过程里的业务逻辑,就搞定了。

    4. 增强安全性:提高代码安全,防止 SQL注入。这一点sql语句也可以做到。

    5. 可扩展性:应用程序和数据库操作分开,独立进行,而不是相互在一起。方便以后的扩展和DBA维护优化。

    缺点

    1. SQL本身是一种结构化查询语言,但不是面向对象的的,本质上还是过程化的语言,面对复杂的业务逻辑,过程化的处理会很吃力。同时SQL擅长的是数据查询而非业务逻辑的处理,如果如果把业务逻辑全放在存储过程里面,违背了这一原则。

    2. 如果需要对输入存储过程的参数进行更改,或者要更改由其返回的数据,则您仍需要更新程序集中的代码以添加参数、更新调用,等等,这时候估计会比较繁琐了。

    3. 开发调试复杂,由于IDE的问题,存储过程的开发调试要比一般程序困难。

    4. 没办法应用缓存。虽然有全局临时表之类的方法可以做缓存,但同样加重了数据库的负担。如果缓存并发严重,经常要加锁,那效率实在堪忧。

    5. 不支持群集,数据库服务器无法水平扩展,或者数据库的切割(水平或垂直切割)。数据库切割之后,存储过程并不清楚数据存储在哪个数据库中。

  10. 什么是视图,视图有什么作用?

    视图(VIEW)也被称作虚表,即虚拟的表,是一组数据的逻辑表示,其本质是对应于一条SELECT语句,结果集被赋予一个名字,即视图名字。

    视图本身并不包含任何数据,它只包含映射到基表的一个查询语句,当基表数据发生变化,视图数据也随之变化。

    作用

    (1) 简化了操作,把经常使用的数据定义为视图。

    (2) 安全性,用户只能查询和修改能看到的数据。

    (3) 逻辑上的独立性,屏蔽了真实表的结构带来的影响。

  11. Btree和Hash区别

    (1)Hash 索引仅仅能满足"=",“IN"和”<=>"查询,不能使用范围查询。

    (2)Hash 索引无法被用来避免数据的排序操作。

    (3)Hash 索引不能利用部分索引键查询。

    (4)Hash 索引在任何时候都不能避免表扫描。

    (5)Hash 索引遇到大量Hash值相等的情况后性能并不一定就会比B-Tree索引高。

转载地址:http://jzumf.baihongyu.com/

你可能感兴趣的文章
结构化查询语言(SQL)原理
查看>>
SQL教程之嵌套SELECT语句
查看>>
几个简单的SQL例子
查看>>
日本語の記号の読み方
查看>>
计算机英语编程中一些单词
查看>>
JavaScript 经典例子
查看>>
判断数据的JS代码
查看>>
js按键事件说明
查看>>
AJAX 初次体验!推荐刚学看这个满好的!
查看>>
AJAX 设计制作 在公司弄的 非得要做出这个养的 真晕!
查看>>
AJAX 自己研究玩的
查看>>
javascript(js)数组操作
查看>>
用JavaScript脚本实现Web页面信息交互
查看>>
window 窗口对象操作
查看>>
公司一位老员工愤然离去的留信!崩溃!
查看>>
C#技巧:网页表单自动填写技术(以gmail为例)
查看>>
C#基础概念二十五问
查看>>
C#在Excel中将连续多列相同数据项合并
查看>>
C#如何把html中的相对路径变成绝对路径
查看>>
用C#编写发手机中文短信息Windows服务
查看>>