文章目录:
什么是MySQL? *MySQL常用的存储引擎有什么?它们有什么区别? ***数据库的三大范式 **MySQL的数据类型有哪些 **索引 ***什么是索引?索引的优缺点?索引的数据结构?Hash索引和B+树的区别?索引的类型有哪些?索引的种类有哪些?B树和B+树的区别?数据库为什么使用B+树而不是B树?什么是聚簇索引,什么是非聚簇索引?非聚簇索引一定会进行回表查询吗?索引的使用场景有哪些?索引的设计原则?如何对索引进行优化?如何创建/删除索引?使用索引查询时性能一定会提升吗?什么是前缀索引?什么是最左匹配原则?索引在什么情况下会失效?数据库的事务 ***什么是数据库的事务?事务的四大特性是什么?数据库的并发一致性问题数据库的隔离级别有哪些?隔离级别是如何实现的?什么是MVCC?数据库的锁 ***什么是数据库的锁?数据库的锁与隔离级别的关系?数据库锁的类型有哪些?MySQL中InnoDB引擎的行锁模式及其是如何实现的?什么是数据库的乐观锁和悲观锁,如何实现?什么是死锁?如何避免?SQL语句基础知识SQL语句主要分为哪几类 *SQL约束有哪些? **什么是子查询? **了解MySQL的几种连接查询吗? ***mysql中in和exists的区别? **varchar和char的区别? ***MySQL中int(10)和char(10)和varchar(10)的区别? ***drop、delete和truncate的区别? **UNIOn和UNIOn ALL的区别? **什么是临时表,什么时候会使用到临时表,什么时候删除临时表? *大表数据查询如何进行优化? ***了解慢日志查询吗?统计过慢查询吗?对慢查询如何优化? ***为什么要设置主键? **主键一般用自增ID还是UUID? **字段为什么要设置成not null? **如何优化查询过程中的数据访问? ***如何优化长难的查询语句? **如何优化LIMIT分页? **如何优化UNIOn查询 **如何优化WHERe子句 ***SQL语句执行的很慢原因是什么? ***SQL语句的执行顺序? *数据库优化大表如何优化? ***什么是垂直分表、垂直分库、水平分表、水平分库? ***分库分表后,ID键如何处理? ***MySQL的复制原理及流程?如何实现主从复制? ***了解读写分离吗? ***什么是MySQL? *百度百科上的解释:MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),使用最常用的数据库管理语言–结构化查询语言(SQL)进行数据库管理。MySQL是开放源代码的,因此任何人都可以在General Public License的许可下下载并根据个性化的需要对其进行修改。MySQL常用的存储引擎有什么?它们有什么区别? ***InnoDBInnoDB是MySQL的默认存储引擎,支持事务、行锁和外键等操作。MyISAMMyISAM是MySQL5.1版本前的默认存储引擎,MyISAM的并发性比较差,不支持事务和外键等操作,默认的锁的粒度为表级锁。InnoDB MyISAM外键 支持 不支持事务 支持 不支持锁 支持表锁和行锁 支持表锁可恢复性 根据事务日志进行恢复 无事务日志表结构 数据和索引是集中存储的,.ibd和.frm 数据和索引是分开存储的,数据.MYD,索引.MYI查询性能 一般情况相比于MyISAM较差 一般情况相比于InnoDB较差索引 聚簇索引 非聚簇索引数据库的三大范式 **第一范式:确保每列保持原子性,数据表中的所有字段值都是不可分解的原子值。第二范式:确保表中的每列都和主键相关第三范式:确保每列都和主键列直接相关而不是间接相关MySQL的数据类型有哪些 **整数TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT分别占用8、16、24、32、64位存储空间。值得注意的是,INT(10)中的10只是表示显示字符的个数,并无实际意义。一般和UNSIGNED ZEROFILL配合使用才有实际意义,例如,数据类型INT(3),属性为UNSIGNED ZEROFILL,如果插入的数据为3的话,实际存储的数据为003。浮点数FLOAT、DOUBLE及DECIMAL为浮点数类型,DECIMAL是利用字符串进行处理的,能存储精确的小数。相比于FLOAT和DOUBLE,DECIMAL的效率更低些。FLOAT、DOUBLE及DECIMAL都可以指定列宽,例如FLOAT(5,2)表示一共5位,两位存储小数部分,三位存储整数部分。字符串字符串常用的主要有CHAR和VARCHAR,VARCHAR主要用于存储可变长字符串,相比于定长的CHAR更节省空间。CHAR是定长的,根据定义的字符串长度分配空间。应用场景:对于经常变更的数据使用CHAR更好,CHAR不容易产生碎片。对于非常短的列也是使用CHAR更好些,CHAR相比于VARCHAR在效率上更高些。一般避免使用TEXT/BLOB等类型,因为查询时会使用临时表,造成严重的性能开销。日期比较常用的有year、time、date、datetime、timestamp等,datetime保存从1000年到9999年的时间,精度到秒,使用8字节的存储空间,与时区无关。timestamp和UNIX的时间戳相同,保存从1970年1月1日午夜到2038年的时间,精度到秒,使用四个字节的存储空间,并且与时区相关。应用场景:尽量使用timestamp,相比于datetime它有着更高的空间效率。索引 ***什么是索引?百度百科的解释:索引是对数据库表的一列或者多列的值进行排序一种结构,使用索引可以快速访问数据表中的特定信息。索引的优缺点?优点:大大加快数据检索的速度。将随机I/O变成顺序I/O(因为B+树的叶子节点是连接在一起的)加速表与表之间的连接缺点:从空间角度考虑,建立索引需要占用物理空间从时间角度 考虑,创建和维护索引都需要花费时间,例如对数据进行增删改的时候都需要维护索引。索引的数据结构?索引的数据结构主要有B+树和哈希表,对应的索引分别为B+树索引和哈希索引。InnoDB引擎的索引类型有B+树索引和哈希索引,默认的索引类型为B+树索引。B+树索引熟悉数据结构的同学都知道,B+树、平衡二叉树、红黑树都是经典的数据结构。在B+树中,所有的记录节点都是按照键值大小的顺序放在叶子节点上,如下图。从上图可以看出 ,因为B+树具有有序性,并且所有的数据都存放在叶子节点,所以查找的效率非常高,并且支持排序和范围查找。B+树的索引又可以分为主索引和辅助索引。其中主索引为聚簇索引,辅助索引为非聚簇索引。聚簇索引是以主键作为B+ 树索引的键值所构成的B+树索引,聚簇索引的叶子节点存储着完整的数据记录;非聚簇索引是以非主键的列作为B+树索引的键值所构成的B+树索引,非聚簇索引的叶子节点存储着主键值。所以使用非聚簇索引进行查询时,会先找到主键值,然后到根据聚簇索引找到主键对应的数据域。上图中叶子节点存储的是数据记录,为聚簇索引的结构图,非聚簇索引的结构图如下:上图中的字母为数据的非主键的列值,假设要查询该列值为B的信息,则需先找到主键7,在到聚簇索引中查询主键7所对应的数据域。哈希索引哈希索引是基于哈希表实现的,对于每一行数据,存储引擎会对索引列通过哈希算法进行哈希计算得到哈希码,并且哈希算法要尽量保证不同的列值计算出的哈希码值是不同的,将哈希码的值作为哈希表的key值,将指向数据行的指针作为哈希表的value值。这样查找一个数据的时间复杂度就是o(1),一般多用于精确查找。Hash索引和B+树的区别?因为两者数据结构上的差异导致它们的使用场景也不同,哈希索引一般多用于精确的等值查找,B+索引则多用于除了精确的等值查找外的其他查找。在大多数情况下,会选择使用B+树索引。哈希索引不支持排序,因为哈希表是无序的。哈希索引不支持范围查找。哈希索引不支持模糊查询及多列索引的最左前缀匹配。因为哈希表中会存在哈希冲突,所以哈希索引的性能是不稳定的,而B+树索引的性能是相对稳定的,每次查询都是从根节点到叶子节点
未完待续。



