数据库设计查询和上线——面试专题
前言
数据库设计查询和上线——面试专题。
一、数据库查询指令的执行顺序
数据库查询指令执行顺序: from 从哪个表查询 where 初步过滤条件 group by 过滤后进行分组 having 对分组后的数据进行二次过滤 select 查看哪些结果字段 order by 按照怎样的顺序进行排序返回
select video_id,count(id) num from chapter group by video_id having num >10
order by video_id desc
二、设计数据库的时候相似类型的字段区分
1、char和varchar
varchar(len) char(len) len存储的是字符还是字节
字符
MySQL中的varchar和char有什么区别,应该怎么选择
对比项 | char(16) | varchar(16) |
---|
长度特点 | 长度固定,存储字符 | 长度可变,存储字符 | 长度不足情况 | 插入的长度小于定义的长度时,用空格补充 | 插入的长度小于定义的长度时,按实际插入长度存储 | 性能 | 存取速度比varchar快很多 | 存储速度比char慢很多 | 使用场景 | 存储很短的,长度固定的字符串,如手机号,MD5等 | 适合用在长度不固定场景,如收货地址,邮箱地址等 |
2、datetime和timestamp
类型 | 占据字节 | 范围 | 时区问题 |
---|
datetime | 8字节 | 1000-01-01 00:00:00到 9999-12-31 23:59:59 | 存储与时区无关,不会发生改变 | timestamp | 4字节 | 1970-01-01 00:00:01 到 2038-01-19 11:14:07 | 存储的是与时区有关,随数据库的时区而发生改变 |
三、针对大数据量sql分页优化思路
现象: 千万级别数据很正常,比如数据流水、日志记录等,数据库正常的深度分页会很慢 慢的原因: select * from product limit N,M MySQL执行此类SQL时需要先扫描到N行,然后再去取M行,N越大,MySQL扫描的记录数越多,SQL的性能就会越差 ?
1、后端、前端缓存
?
2、使用ElasticSearch分页搜索
?
3、合理使用 mysql 查询缓存,覆盖索引进行查询分页
select title,cateory from product limit 1000000,100
4、如果id是自增且不存在中间删除数据,使用子查询优化,定位偏移位置的 id
select * from oper_log where type=‘BUY’ limit 1000000,100; //5.秒
select id from oper_log where type=‘BUY’ limit 1000000,1; // 0.4秒 ? select * from oper_log where type=‘BUY’ and id>=(select id from oper_log where type=‘BUY’ limit 1000000,1) limit 100; //0.8秒
四、数据库上线流程,版本更新流程
总结
数据库设计查询和上线——面试专题。
|