IT技术博客大学习 共学习 共进步

如何建立索引

博客园-rethink log 2009-10-16 12:11:22 浏览 4,563 次

    关于如何建立索引,及哪些情况适合使用索引,哪些情况不适合使用索引,各种书籍资料有很多。

    但是最重要的原则是:实际测试。

    实践是检验真理的唯一标准。建立索引的时候,应进行如下测试:

    1 explain select语句,看看是否有使用到索引。

    2 运行update和insert操作,看看建立索引的负效应是否在可接受范围。

    3 务必在接近生产环境的数据规模下进行索引性能的测试。

    第三点尤为重要。

    因为在最近的项目优化过程中,发现:

    在某个字段上建立了索引之后,如果是select返回30条记录,建立索引之后,select时间降到原来的1/6。提高很明显。

    而在生产环境下,这个select需要返回的结果通常是上千(甚至上万的),建立索引之后,select的时间反而增加了快一倍。因此建立索引反而适得其反。

    分析后觉得可能的原因如下:

    1 该字段建立索引之后,基数并不高,也就是该字段的重复率较高,索引对性能的提升不明显。简单说,比如一个字段是:性别,只有男女两种情况,那建立索引完全没必要,反而降低了性能。

    2 该select要返回的结果集很大(超过了1000条记录)。在这种情况下,mysql先查询索引,而后根据索引到表中取得记录,这个操作在需要取得的记录非常多的情况下,非常耗时。最终导致了:建立索引之后,select时间反而增加的情况。

    这次的主要原因是2.  因为还进行了如下测试:如果该select语句只返回30条记录,建立索引之后,select时间为原来的1/6。

    建立索引要注意的地方很多,最重要的原则还是:实际测试。

建议继续学习

  1. 由浅入深探究mysql索引结构原理、性能分析与优化 (阅读 16,124)
  2. 浅谈MySQL索引背后的数据结构及算法 (阅读 11,384)
  3. 由浅入深理解索引的实现(2) (阅读 7,524)
  4. HBase二级索引与Join (阅读 6,862)
  5. 如何建立合适的索引? (阅读 6,665)
  6. mysql查询中利用索引的机制 (阅读 6,584)
  7. InnODB和MyISAM索引统计集合 (阅读 6,084)
  8. Innodb 表和索引结构 (阅读 6,041)
  9. MySQL索引背后的数据结构及算法原理 (阅读 5,622)
  10. mysql索引浅析 (阅读 5,184)