编程概念(一):数据库相关

1、sql关键字写的顺序以及执行顺序

建议的书写顺序为:

SELECT [ DISTINCT ]
FROM
WHERE
GROUP BY
HAVING
UNION
ORDER BY

执行顺序:

FROM 
ON 
 JOIN 
WHERE 
GROUP BY 
HAVING 
SELECT
DISTINCT 
ORDER BY 
LIMIT 

2、数据库三范式

  • 1NF是对属性的原子性约束,要求属性(列)具有原子性,不可再分解(只要是关系型数据库都满足1NF)
  • 2NF是对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性
  • 3NF是对字段冗余性的约束,它要求字段没有冗余。 没有冗余的数据库设计可以做到

3、索引

  • 索引类型
    根据用途可分为:普通索引、唯一索引(可为空)、主键索引(特殊的唯一索引,不能为空)、组合索引(最左前缀)、覆盖索引、全文索引(类似搜索引擎)。根据结构可分为:BTREE、HASH(缺点有不适合于组合索引和覆盖索引情况、不能排序、不能范围查询<>和<=>不一样)、RTREE(适用于范围查询,空间索引)、FULL TEXT
  • 索引好处
    减少扫描数据量、避免排序和临时表、随机IO变为顺序IO
  • 索引缺点
    会增大开销,对UPDATE、INSERT等语句会有性能影响
  • 不使用索引场景
    有or、组合索引不符合规则、like查询是以%开头、优化引擎认为不用索引更快
  • 索引原理
    待完善

4、数据库事务

  • ACID原则(原子性、一致性、隔离性、持久性)
  • 隔离级别:未提交读、提交读(不可重复读)、可重复读(默认会导致幻读,可通过MVCC处理)、可串行(级别最高,开销最大)

5、mysql存储引擎

  • InnoDB
    默认事务型引擎,采用MVCC(多版本并发控制)支持高并发,实现了四个事务级别,默认可重复读(通过间隙锁处理了幻读)
  • MyISAM
    5.1之前的默认引擎,支持很多特性包括全文索引(5.6后InnoDB支持)、压缩、空间函数等,不支持事务和行级锁,崩溃不能安全恢复。某些场景性能很好,最典型性能问题是表锁

6、查询优化(不同场景可能结论不同,适用于大部分场景)

  • 看查询计划
  • 使用索引,特别是覆盖索引
  • 是否请求了不需要的数据
  • 减少查询数据量,比如join时先过滤数据,或对中间数据做缓存表
  • 用联表代替子查询
  • 尽可能减少sql执行次数,减少请求网络延时
  • 使用正确而小的数据类型,比如内建类型存时间,整数类型存ip
  • 尽量避免null
  • 冗余数据避免联表
  • 分表分区
  • 业务结构优化
  • 硬件、中间件等支持

——————————————————————————————

  • 注1:本文很多概念来源于《高性能MySQL》
  • 注2:以上概念无特别说明适用于mysql,不同数据库可能会有出入

你可能感兴趣的:(编程概念(一):数据库相关)