xiaohanliang
Database
Database
  • review
  • MySQL
    • 0. 索引就是树吗
    • 1. 索引是怎么发挥作用的
    • 2. 聊聊怎么估时间
    • 3. 主键玄学
    • 4. 事务的执行过程@ACD
    • 5. MVCC就是用undolog回退
    • 6. 事务如何彼此隔离@I
    • 7. 如何人为的制造死锁
    • 8. 引擎是干什么的
    • 9. 主从复制怎么做到的
    • 10. 寻找同步起始点GTID
    • 11. 预解析Statement
  • Redis
    • 0. Hash@数据结构
    • 1. ZSet@数据结构
    • 2. 场景与玩法@数据结构
    • 3. 可能的风险点
    • 4. Redis的落盘
    • 5. 关于效率的讨论
    • 6. 主从模式@集群化
    • 7. [WIP]Proxy实现@集群化
    • 8. 标准玩法@集群化
  • KV/Distributed
    • 0. 面临的问题
    • 1.Raft@原理
    • 2. LSM@原理
    • 3. [WIP]分布式事务@原理
Powered by GitBook
On this page
  • 简单预估法
  • 快速时间预估

Was this helpful?

  1. MySQL

2. 聊聊怎么估时间

简单预估法

在上一节我们介绍了怎样才能算一个好的索引, 这一节我们介绍一下怎样去预估一下这个索引的表现, 先介绍一种简单的方法:

判断这个SQL语句中的WHERE条件是否都出现在索引中了, 我们举个例子说明, 假设你的SQL语句如下, 并且当前你给name设置了索引

SELECT id,name,age 
FROM users
where name='xiaohan'

那么按照索引的规则, 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秒以上, 我虽然觉得很夸张, 但这是千万级别的表, 想想也不是不可能... 那咋整呢? 要么你别查*要么你给你的索引多加一些字段上去

Previous1. 索引是怎么发挥作用的Next3. 主键玄学

Last updated 4 years ago

Was this helpful?