数据在磁盘中是以 “块” 的形式存储的,所以一张表涉及的数据可能会存在多个块中,而在磁盘中查询数据则会根据字段是否为有序与无序来区分,
无序情况:1.数值具有唯一性则需要查找 总块数/2
2.无序+无唯一性则需要查找 总块数
有序情况:1.数值唯一性:log2(总块数/2) (log2是二分查找算法)
2.无唯一性:log2(总块数)
结论:索引是对字段的有序排序,属于有序情况,其查找的块数大大减少了,所以才能大大提高查询的效率
举例:有一个myisam的表good,记录数是500w,每个记录的字节数是204,而做了索引的有序字段字节数是54 (建立索引时候会创建一个索引数据结构,往后的查询就是在该结构上做处理,下面的“什么是索引”有提及到该点)
情况:myisam默认的块的字节数是1024, 所以一个块能存储的记录数是5(1024/204),索引的一个块能存储的记录数是18(1024/54), 那么good表需要的总块数是100w(500w/5),而good的索引字段需要的总块数是277778(500w/18)
结论:有序的字段查询(索引的字段)需要查找的块数是:log2(277778) 或 log2(277778/2), 具体看该索引字段是否存在值唯一性,而无序字段则需要查找100w或者50w个块,效率低下啊
什么是索引(What is indexing)?
索引是对记录集的多个字段进行排序的方法。在一张表中为一个字段创建一个索引, 将创建另外一个数据结构,包含字段数值以及指向相关记录的指针,然后对这个索引结构进行排序,允许在该数据上进行二分法排序。
副作用是索引需要额外的磁盘空间,对于MyISAM引擎而言,这些索引是被统一保存在一张表中的,这个文件将很快到达底层文件系统所能够支持的大小限制,如果很多字段都建立了索引的话