
1、三大范式数据库的范式指的是数据库设计的规范化过程旨在减少数据冗余提高数据一致性从而提高数据库的性能和可维护性第一范式1NF确保表的每一列都是不可分割的基本数据单元第二范式2NF在 1NF 的基础上要求数据库表中的每一列都和主键直接相关而不能只与主键的某一部分相关主要针对联合主键。第三范式3NF在 2NF 的基础上消除非主键列对主键的传递依赖即非主键列只依赖于主键列不依赖于其他非主键列。2、DDL数据定义语句、DML数据操作语句、DQL数据查询语句3、索引索引就像是目录指出数据在磁盘上存储的位置避免扫描整个磁盘浪费时间常见索引数据结构有三种哈希【适合等值查询】、有序数组【适合静态存储更新成本高】、树 。InnoDB采用B树存储索引【也可以用哈希】。聚族索引叶节点存储了一行数据的所有属性非聚族索引只包含主键值和索引列要通过主键值进一步查询行【需要回表】。InnoDB的主键一般就是聚簇索引如果一张表未设置主键也没有适合做主键的唯一索引InnoDB 会生成一个名为 GEN_CLUST_INDEX 的隐藏聚簇索引使用索引查询时不要对索引做其他操作避免索引失效对于组合索引Hash索引在计算Hash值的时候是组合索引键合并后再一起计算Hash值而不是单独计算Hash值所以通过组合索引的前面一个或几个索引键进行查询的时候Hash索引也无法被利用B树非叶子节点保存的是子树中最大或最小的关键字B树范围查询要使用中序遍历 。B树搜索时间复杂度 分别表示节点内顺序查找和二分查找【不考虑IOB树时间优于他】4、最左前缀匹配原则使用联合索引时查询条件从索引的最左列开始并且不跳过中间的列。因为B树存储索引是按照创建的顺序并排序的如果查不到前一个后面的也没法查5、如果查询条件使用了索引特别是主键索引或唯一索引SELECT FOR UPDATE 会锁定特定的行。如果没使用索引则会锁全表进行全表扫描。一般的读是指当前读会加悲观锁。MVCC使用快照读【多版本控制可能不是最新数据】不用加锁MVCC通过保存同一条数据的多个版本来解决并发冲突读写操作处理不同的版本互不冲突版本链用链表记录同一条数据每次被修改后的状态将这些状态串起来Read view通过对比不同版本的ID大小【ID是事务的ID属于递增的】来确定哪个版本可见6、数据库的乐观锁和悲观锁乐观锁不使用数据库的锁机制通过版本控制在程序中实现悲观锁就是数据库级的有共享和排他。SQL共享锁多个事务可访问只读不写排他锁一个事务访问7、事务原子性【undo log保证】、一致性【其他三个的结果】、隔离性【并发执行的事务彼此隔离MVCC】、持久性【成功的修改被日志保存不会丢失。redo log保证】事务隔离级别读未提交【脏读、幻读、不可重复读】、读已提交【不可重复读、幻读】、可重复读默认级别【每次结果一致幻读】、串行化【事务通过加锁串行执行最安全】。脏读是指读取的数据尚未提交、不可重复读是指多次读取结果不同【对一项数据】、幻读是指多次查询结果不一样【一批数据整体】启动事务begin/start transation【此时事务不会自动提交】提交事务commit事务回滚rollback事务状态活动的【正在执行】、部分提交的【内存执行完了但没同步硬盘】、失败的、中止的【回滚之后的状态】、提交的8、分库分表【缓解存储压力】垂直拆分垂直分库以表为依据根据业务不同将不同的表拆分到不同的库中垂直分表依据字段的不同将不同字段属性拆分到不同的表中水平拆分水平分库数据太多装不下拆分成多个库。可以通过路由的方式访问不同的数据库水平分表同上。降低IO争抢锁表概率其中存在的分布式同步和路由问题可以采用中间件【MyCat】解决9、view视图不用重复执行查询不占用内存【其存储在information_schema的views表中】查询时可以把它当作表使用10、数据库的冷热备份冷备份备份期间数据库要停止服务热备份备份期间数据库仍可提供服务【MyISAM不支持】温备份备份期间数据库只提供读操作不提供写操作11、PREPARE语句准备好一条SQL语句并分配给这条SQL语句一个名字供之后调用。准备好的SQL语句通过EXECUTE命令执行通过DEALLOCATE PREPARE命令释放掉。-- 准备 PREPARE user_query (INT) AS SELECT id, name, age FROM users WHERE age $1; -- 执行可多次 EXECUTE user_query (25); EXECUTE user_query (30); -- 释放 DEALLOCATE PREPARE user_query;性能SQL 只需解析、编译一次之后多次执行可复用执行计划。安全参数通过占位符传入能有效防止 SQL 注入。灵活一条语句可配不同参数反复调用。