mysql索引的疑惑??

先说说我对mysql索引的理解:

A

name      sex        age
cxl       male       21
yueshu    female     20
csy       female     0
....

普通情况下,name 字段未建立索引,A 表中查找 name = yueshu 的记录,则查询过程如下:

// 原表中查询
name = cxl       , No
name = yueshu    , Yes => return

一条条按照记录的先后顺序,线性查找下去,直到符合条件的出现,则终止查询。

name 建立索引的情况下,A 表中查找 name = yueshu 的记录,则查询过程如下(参考资料http://blog.csdn.net/iefreer/...):

1. 由于 name 字段建立了索引,所以实际上在建立索引的同时
   1.1 数据库会隐式的生成一张保存了当前索引字段和当前索引字段所在记录指针的索引表
       索引表会占据额外的磁盘空间
   1.2 占据的空间计算:
        1.2.1 占据空间 = 磁盘块数量 * 默认的磁盘块大小
            1.2.1.1 磁盘块数量 = 记录数 / 每磁盘块存放的记录数
                1.2.1.1.1 每磁盘块存放的记录数 = 默认的磁盘块大小 / 每条记录占据的磁盘大小

2. 查找数据的时候是在这张索引表中去查找的,并不会在原表中进行查找
    2.1 mysql查询过程
        2.1 mysql 查询是在磁盘块上进行线性查找
    2.2 查找效率对比
        2.2.1 索引表中的磁盘块数量 远小于 原表中的磁盘块数量,所以在建立了索引的字段上进行查找
              能够在更小的范围内查找出想要的结果,因而,效率,非常高

请结合 参考资料 上的描述,先纠正下我对索引的理解,然后在给出正确的解释...谢谢

阅读 2.4k
2 个回答

/**
一条条按照记录的先后顺序,线性查找下去,直到符合条件的出现,则终止查询。
**/
错误1:会全表扫描.因为有可能有多条

索引可以很形象的表示为书的目录.
如果没有目录.你要找到某一章节.需要翻遍一本书.耗时
现在为章节建立了索引.生成了目录页.
目录占了2张纸.但是查询时.可以快速的找到某一章节在第几页.

索引的缺点,数据量大时,在 update,insert 操作,影响性能.因为不仅要更新数据,还有更新索引.

纠正一下:

1、如果SELECT的字段不能完全包含在索引字段清单中,还需要根据表的主键ID查询原表。

2、索引查询快的关键是索引字段按排序的树形结构,不是你说的顺序查询,因此可以快速定位到符合条件的索引字段值,可以搜一下B树的查询过程就很好理解了。

下面这个链接是讲oracle的B树索引,原理基本是一样的。
http://www.idouba.net/oracle-...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题