https://www.cnblogs.com/aspwebchh/p/6652855.html
主键是啥
唯一标识一条记录,不能有重复的,不允许为空。
索引是啥
索引就像书的目录, 通过书的目录就准确的定位到了书籍具体的内容
这句话描述的非常正确, 但说了跟没说一样,所以还是要看原理。想要理解索引原理必须清楚一种数据结构「平衡树」(非二叉),也就是b tree或者 b+ tree。
平衡树(b tree)
(原理不写了)
不设主键的表,只是一条条数据;设置了主键的表,存储结构就变成了树状结构,如下图所示。
假如一张表有一亿条数据 ,需要查找其中某一条数据,按照常规逻辑, 一条一条的去匹配的话, 最坏的情况下需要匹配一亿次才能得到结果,用大O标记法就是O(n)最坏时间复杂度,这是无法接受的,而且这一亿条数据显然不能一次性读入内存供程序使用, 因此, 这一亿次匹配在不经缓存优化的情况下就是一亿次IO开销,以现在磁盘的IO能力和CPU的运算能力, 有可能需要几个月才能得出结果 。如果把这张表转换成平衡树结构(一棵非常茂盛和节点非常多的树),假设这棵树有10层,那么只需要10次IO开销就能查找到所需要的数据, 速度以指数级别提升,用大O标记法就是O(log n),n是记录总树,底数是树的分叉数,结果就是树的层次数。换言之,查找次数是以树的分叉数为底,记录总数的对数,用公式来表示就是
用程序来表示就是Math.Log(100000000,10),100000000是记录数,10是树的分叉数(真实环境下分叉数远不止10), 结果就是查找次数,这里的结果从亿降到了个位数。因此,利用索引会使数据库查询有惊人的性能提升。
But!
事物都是有两面的, 索引能让数据库查询数据的速度上升, 而使写入数据的速度下降,原因很简单的, 因为平衡树这个结构必须一直维持在一个正确的状态, 增删改数据都会改变平衡树各节点中的索引数据内容,破坏树结构, 因此,在每次数据改变时, DBMS必须去重新梳理树(索引)的结构以确保它的正确,这会带来不小的性能开销,也就是为什么索引会给查询以外的操作带来副作用的原因。
note:
-
索引就是对一个表的某个字段,或者多个字段(联合索引)建立一种特殊的存储结构(b tree)。
主键是索引的一种,是唯一索引的特殊类型。创建主键的时候,数据库默认会为主键创建一个唯一索引。
-
使用索引的注意事项:
联合索引必须按照字段依次使用,否则后面字段不生效
当联合索引嵌套函数的时候,索引不生效 -
以下几种情况不适合建索引:
表记录太少
经常插入、删除、修改的表
数据重复且分布平均的表字段。如一个表有10万行记录,其中字段column1只有A和B两种值,且每个值的分布概率大约为50%,那么对这种表column1字段建索引一般不会提高数据库的查询速度。