1、sql关键字写的顺序以及执行顺序
建议的书写顺序为:
SELECT [ DISTINCT ]
FROM
WHERE
GROUP BY
HAVING
UNION
ORDER BY
执行顺序:
FROM <left_table>
ON <join_condition>
<join_type> JOIN <right_table>
WHERE <where_condition>
GROUP BY <grout_by_list>
HAVING <having_condition>
SELECT
DISTINCT <select_list>
ORDER BY <order_by_list>
LIMIT <limit_number>
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,不同数据库可能会有出入
网友评论