2. 聊聊怎么估时间
简单预估法
在上一节我们介绍了怎样才能算一个好的索引, 这一节我们介绍一下怎样去预估一下这个索引的表现, 先介绍一种简单的方法:
判断这个SQL语句中的WHERE
条件是否都出现在索引中了, 我们举个例子说明, 假设你的SQL语句如下, 并且当前你给name设置了索引
那么按照索引的规则, id一定会出现在索引上, 变成(id, name)我们会发现这里面缺少了age
, 这代表我们需要多执行一步"回表", 根据id回去把age取回来才行, 多了一步随机I/O, 如果你想让它表现更好一点, 你需要在你的索引上再加上一个age字段, 变成(id,name,age)
快速时间预估
这一步我们来尝试估算一下时间, 假设你有一个user表, 表里有一千万行数据, 现在里面已经有了如下索引: (name,city) / (name,age) / name, 现在你写下查询语句: select * from users where name=xiaohan and city=beijing
在这样的查询条件下我们可以使用(name,city)
索引, 假设name=xiaohan
命中率为0.05%且city=beijing
命中率为12%, 这样下来, 在叶节点上, 我们能扫出600条数据出来.
因为是叶节点中的数据全是连在一起的, 那么我们需要一次随机磁盘IO, 以及599次的顺序磁盘IO(太好了索引就是屌啊!!)
因为我们要查
*
所以还得回表(-.-||不是吧), 那就是再加600次随机磁盘IO
一次随机IO算你10ms好了, 6秒以上, 我虽然觉得很夸张, 但这是千万级别的表, 想想也不是不可能... 那咋整呢? 要么你别查*
要么你给你的索引多加一些字段上去
Last updated
Was this helpful?