MySQL基础知识

 

Mysql常用存储引擎

存储引擎 事务 外键 空间数据 性能 索引类型
MyISAM 表级锁 不支持 不支持 支持 非聚集索引
InnoDB

行锁、页锁、表级锁

 

支持 支持 不支持 主键为聚集索引,其他为辅助索引

 

事务

      事务是逻辑上的⼀组操作,要么都执⾏,要么都不执⾏。

  • 事务四大特性

    • 原⼦性(Atomicity): 事务是最⼩的执⾏单位,不允许分割。事务的原⼦性确保动作要么全部完成,要么完全不起作⽤;

    • ⼀致性(Consistency): 执⾏事务前后,数据保持⼀致,多个事务对同⼀个数据读取的结果是相同的;

    • 隔离性(Isolation): 并发访问数据库时,⼀个⽤户的事务不被其他事务所⼲扰,各并发事务 之间数据库是独⽴的;

    • 持久性(Durability)⼀个事务被提交之后。它对数据库中数据的改变是持久的,即使数据 库发⽣故障也不应该对其有任何影响。

  • 并发事务带来的问题

    • 脏读(Dirty read): 当前事务读到了T1事务未提交的数据,然后T1事务回滚,这个数据就是一个脏数据
    • 不可重复读(Unrepeatableread):当前事务第一次查询没有数据,这是T1事务提交了一条数据,当前事务再次查询,却查到了这次数据,在一次事务中读到的数据不一致
    • 幻读(Phantom read):幻读和不可重复度类似,它发⽣在⼀个事务(T1)读取了⼏⾏数据,接着另⼀个并发事务(T2)插⼊了⼀些数据时。在随后的查询中,第⼀个事务(T1)就会发现多了⼀些原本不存在的记录,就好像发⽣了幻觉⼀样
    • 丢失修改:指在⼀个事务读取⼀个数据时,另外⼀个事务也访问了该数据,那么在第⼀个事务中修改了这个数据后,第⼆个事务也修改了这个数据。这样第⼀个事务内的修改结果就被丢失,因此称为丢失修改。 例如:事务1读取某表中的数据A=20,事务2也读取A=20,事务1修改A=A-1,事务2也修改A=A-1,最终结果A=19,事务1的修改被丢失。
  • 事务隔离级别

    • READ-UNCOMMITTED(读未提交):允许读取未提交的数据,,可能会导致脏读、幻读或不可重复读。
    • READ-COMMITTED(读已提交):允许读取已提交数据,可以阻⽌脏读,但是幻读或不可重复读仍有可能发⽣。
    • REPEATABLE-READ(可重复读):对同⼀字段的多次读取结果都是⼀致的,除⾮数据是被本身事务⾃⼰所修改,可以阻⽌脏读和不可重复读,但幻读仍有可能发⽣。
    • SERIALIZABLE(可串⾏化):完全服从ACID的隔离级别。所有的事务依次逐个执⾏,这样事务之间就完全不可能产⽣⼲扰,也就是说,该级别可以防⽌脏读、不可重复读以及幻读。

          MySQL默认隔离级别 REPEATABLE-READ(可重复读)


索引

        概念:索引是一种数据结果,帮助提高获取数据的速度

        优点:索引能极大的减少存储引擎需要扫描的数据量;索引可以把随机 IO 变成顺序 IO;索引可以帮助我们在进行分组、排序等操作时,避免使用临时表。

  • 聚集索引:索引中键值的逻辑顺序决定了表中相应行的物理顺序(索引中的数据物理存放地址和索引的顺序是一致的)
  • 非聚集索引:索引的逻辑顺序与磁盘上的物理存储顺序不同
  • 辅助索引:索引的逻辑顺序与磁盘上的物理存储顺序不同,里面存储了一个指向行数据的数据索引(查询数据时,先检索辅助索引拿到主键,然后在根据主键在主键索引中获取数据,也叫回表)
  • 索引数据结构

    • B-树(B树):待补充
    • B+树:待补充
    • B*树:待补充

执行计划

      EXPLAIN 是解释 SQL 语句的执行计划,即显示该 SQL 语句怎么执行的。

explain select * from user_info  order by user_name

  • id 执行select子句或操作表的顺序
    • id相同:执行顺序由上至下
    • id不同:如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行
    • id相同又不同(两种情况同时存在):id如果相同,可以认为是一组,从上往下顺序执行;在所有组中,id值越大,优先级越高,越先执行

  • select_type:主要是用于区分普通查询、联合查询、子查询等复杂的查询
    • SIMPLE:简单的select查询,查询中不包含子查询或者union
    • PRIMARY:查询中包含任何复杂的子部分,最外层查询则被标记为primary
    • SUBQUERY:在select 或 where列表中包含了子查询
    • DERIVED:在from列表中包含的子查询被标记为derived(衍生),mysql或递归执行这些子查询,把结果放在零时表里
    • UNION:若第二个select出现在union之后,则被标记为union;若union包含在from子句的子查询中,外层select将被标记为derived
    • UNION RESULT:从union表获取结果的select
  • table : 表名称
  • partitions: 分区
  • type:扫描类型system>const>eq_ref>ref>range>index>ALL 其扫描速度由快到慢
    • system:系统表,少量数据,往往不需要进行磁盘IO
    • const:命中主键或者唯一索引,常量连接
    • eq_ref:命中主键索引或者非空唯一索引,等值扫描
    • ref:非主键非唯一索引的索引,等值扫描(可能会有多行数据返回)
    • range:索引上的范围查询,它会在索引上扫码特定范围内的值
    • index:扫描索引上的全部数据来计数,它仅比全表扫描快一点
    • ALL:全表扫描
  • possible_keys:  查询过程中有可能用到的索引。
  • key:实际使用的索引,如果为 NULL ,则没有使用索引。
  • key_len:表示索引使用的字节数,key通过该列计算查询中使用的索引长度
  • ref: type访问类型的具体指
  • rows:根据表统计信息或者索引选用情况,大致估算出找到所需的记录所需要读取的行数。
  • filtered :表示返回结果的行数占需读取行数的百分比, filtered 的值越大越好。
  • Extra :额外信息
    • Using filesort:MySQL 对数据使用一个外部的文件内容进行了排序,而不是按照表内的索引进行排序读取。
    • Using temporary:使用临时表保存中间结果,也就是说 MySQL 在对查询结果排序时使用了临时表,常见于order by 或 group by。
    • Using index:表示 SQL 操作中使用了覆盖索引(Covering Index),避免了访问表的数据行,效率高。
    • Using index condition:表示 SQL 操作命中了索引,但不是所有的列数据都在索引树上,还需要访问实际的行记录。
    • Using where:表示 SQL 操作使用了 where 过滤条件。
    • Select tables optimized away:基于索引优化 MIN/MAX 操作或者 MyISAM 存储引擎优化 COUNT(*) 操作,不必等到执行阶段再进行计算,查询执行计划生成的阶段即可完成优化。
    • Using join buffer (Block Nested Loop):表示 SQL 操作使用了关联查询或者子查询,且需要进行嵌套循环计算。

欢迎大家进行补充和说明

整理自:https://www.cnblogs.com/yinjw/p/11864477.html 

               https://www.jianshu.com/p/514aa0b139d8

你可能感兴趣的:(面试,mysql,mysql)