SQL日记
SQL知识
UNION
UNION 和 UNION ALL 用来 合并两个或多个 SELECT 查询的结果集,要求每个 SELECT 查询的 列数和列类型必须一致。
| 操作 | 功能 | 去重情况 | 性能 |
|---|---|---|---|
UNION | 合并结果集,并自动去掉重复行 | 会去重 | 较慢(需要排序去重) |
UNION ALL | 合并结果集,不去重 | 不去重 | 快(直接合并) |
1 | |
GROUP_CONCAT
GROUP_CONCAT 是一个SQL 函数,用来将拼接字符传的
1 | |
IN
- IN 会走索引吗?
- 我:
答:走索引,MySQL 会把它当成多个 id = ? 的等值查询。
IN 的数量太大,超过表数据的四分之一时,会有全表扫描
SQL规范
非主子表尽量不要连表查询
- 非主子表一般没有 一对多关系,或者外键关联的表。用join 极大可能会走全表扫面。使SQL速度很慢。
- join 会使SQL 耦合较高,不好维护。
多表 JOIN 时,尽量选择结果集较小(过滤后行数少)的表作为驱动表(Driving Table)
- 驱动表:先被读取、做循环的那张表
- 被驱动表:根据驱动表的行去匹配的表
-SQL执行的时候,会先去查 驱动表的数据,然后循环每一条数据,去匹配他表。所以 小表作为驱动表,可以使循环次数最少1
2
3for(驱动表每一行){
去被驱动表匹配
}
- update 语句 禁止携带 limit
可能导致主从不一致。
主从数据库采用 Statement-Based Replication(SBR,语句复制) 时,binlog记录sql语句,同步到主表。主库和从库更新的数据可能不一样,如果没有明确指定 id
Row-Based Replication(RBR,行复制) 记录的是一整行的数据,相对安全
总结
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Little Monste'Blog!
评论





