NoteDeep
本页讨论:
  • 查询的消耗到底在什么地方呢?
  • 如何优化查询和索引?

查询的消耗到底在什么地方


只有搞清上面的问题就可以更好的分析我们的索引。

索引常被加载到mysql缓存池 或者 磁盘的读取缓存中。所以查索引的时候,一般都是在内存中查,这个速度是比较快的,大概10ms~20ms。

如果索引没有被载到内存里,也是我们接下来的QUBE(快速上限估算法中考虑的情况)。那么我们就要考虑查询索引时的 随机IO以及顺序IO

如果没有索引覆盖,就得再算上查询表的 随机IO以及顺序IO
以及fetch数据时的时间消耗,

  • 每次随机I/O大概耗时 10ms
  • 每次顺序I/O只有 0.01ms
  • 如果数据页大小为4kb,每fetch一页,大概耗时0.1ms (4kb/40M)

优化查询和索引

这样一来,就清楚我们的目标了。

1、减小扫描的数据量,最好就是实现索引覆盖,不用再去聚簇索引里查了。
这样可以减少 fetch的耗时,以及扫描时的I/O消耗

2、尽量减少随机I/O
每次随机I/O的消耗是比较大的。
这也是聚簇索引性能好的原因,当结果集是连续的时候,基本只需要顺序I/O。或者是只在跳跃的时候需要随机I/O。
但是像Myisam这种非聚簇,索引的叶节点存的是指针,对表的访问就都会变成随机I/O。


参考:
《数据库索引设计与优化》






评论列表

    查询的消耗到底在什么地方
    优化查询和索引