Hash索引

B+树索引

  1. varchar 和 char 有什么区别?

char 是一个定长字段,那么无论实际存储多少内容,该字段都占用10个字符
varchar 是变长的,即申请的空间只是最大长度,占用的空间为实际字符长度+1,最后一个字符存储用了多长的空间
从检索效率上来讲,char>varchar

  1. varchar(10) 和 int(10) 代表什么含义

varchar的 10 代表了申请的空间长度,也是可以存储的数据的最大长度
int的10 只是代表了展示的长度,不足10位以0填充。也就是说,int(1)和int(10)所能存储的数字大小以及占用的空间都是相同的,只是展示时按照长度展示

  1. 超大分页怎么处理?

数据库层面:
原始:select from table where age > 20 limit 1000000,10
优化:select
from table where id in (select id from table where age > 20 limit 1000000,10)
优化后,虽然也load了一百万的数据,但是由于索引覆盖,要查询的所有字段都在索引中,所以速度会很快
优化的可能性有许多种,但是核心思想都一样,就是减少load的数据
从需求的角度减少这种请求
主要是不做类似的需求(直接跳转到几百万页之后的具体某一页。只允许逐页查看或按照给定的路线走,这样可预测,可缓存)以及防止ID泄漏且连续被人恶意攻击
解决超大分页,其实主要是靠缓存,可预测性的提前查到内容,缓存至redis等k-v数据库中,直接返回即可

  1. sql耗时,慢查询

原因:load了不需要的数据、查询条件没有命中索引、数据量太大
对应:首先分析语句,看看是否load了额外的数据
分析语句的执行计划,获得其使用索引的情况。修改语句或修改索引,是的语句尽可能地命中索引
若是语句优化已经到位,则考虑数据量是否太大,进行横向或纵向分表

  1. 三个范式

每个列都是不可在拆分的
非主键列完全依赖于主键,而不能依赖于主键的一部分
非主键列只依赖于主键,不依赖于其他非主键