一、索引设计原则
1、搜索的索引列,不一定是所要选择的列。最适合索引的列是出现在WHERE字句中的列,或连接子句中的列,而不是出现在SELECT关键字后的选择列表中的列。
2、使用唯一索引。考虑某列中值的分布。对于唯一值的列,索引的效果最好,而具有多个重复值的列,其索引效果最差。
3、尽量选择区分度搞的列作为索引:区分度表示字段值不重复的比例
4、使用短索引。如果对串列进行索引,应该指定一个前缀长度,只要有可能就要这样做。例如,如果一个CHAR(200)列,如果在前10个或20个字符内,多数值是唯一的,那么就不要对这个列进行索引。
5、利用最左前缀。在创建一个n列的索引时,实际是创建了MySQL可利用的n个索引。多列索引可起几个索引的作用,因为可利用索引中最左边的列集来匹配行。这样的列集称为最左前缀。(这与索引一个列的前缀不同,索引一个列的前缀是利用该索引的n前个字符作为索引值)
6、不要过度索引。每个额外的索引都要占用额外的磁盘空间,并降低写操作性能。在修改表的内容是,索引必须进行更新,有时可能需要重构,因此,索引越多,索引花的时间越长。
如果一个索引很少利用或从不使用,那么会不必要的减缓表的修改速度。此外,MySQL在生成一个执行计划时,要考虑各个索引,这也要费时间。
创建多余的索引给查询优化带来了更多的工作。索引太多,也可能会使MySQL选择不到所要使用的最好索引。只保持所需的索引有利于查询优化,如果想给已有索引的表增加索引,应该考虑所要增加的索引是否是现有多列索引的最左索引。
7、考虑在列上进行的比较类型。索引可用于“<”,“<=”,“=”,“>=”,“>”和BETWEEN运算。在模式具有一个直接量前缀时,索引也用于Like运算。如果只将某个列用于其他类型的运算时(如STRCMP()),对其索引没有价值。
二、索引的分类
1、按物理存储角度可分为:
(1) 聚簇索引(主键索引):将数据存储与索引放到了一块,找到索引也就找到了数据,不需要根据主键或行号去进行回表查询。
(2) 非聚簇索引:非聚簇索引就是指B+Tree的叶子节点上的data,并不是数据本身,而是数据存放的地址。
2、按数据结构划分:
(1) BTREE: B 树是一种多叉路衡查找树,相对于二叉树, B 树每个节点可以有多个分支,即多叉。
(2) HASH:哈希索引就是采用一定的 hash 算法,将键值换算成新的 hash 值,映射到对应的槽位上,然后存储在hash表中。
其特点如下:
A. Hash 索引只能用于对等比较 (= , in) ,不支持范围查询( between , > , < , … )
B. 无法利用索引完成排序操作
C. 查询效率高,通常 ( 不存在 hash 冲突的情况 ) 只需要一次检索就可以了,效率通常要高于 B+tree 索
引
(3) FULLTEXT:
(4) R-Tree:
3、按逻辑角度划分
(1) 普通索引:仅加速查询
(2) 唯一索引: 要求索引列的所有值都只能出现一次,即必须唯一(可以有null)。
(3) 主键索引:是唯一索引的特定类型。表中创建主键时自动创建的索引 ,一个表只能建立一个主索引。
(4) 联合索引:多列值组合成一个索引,专门用于组合搜索,其效率大于索引合并。
(5) 全文索引:对文本的内容进行分词,进行搜索。
数据库索引的创建原则和索引分类
最新推荐文章于 2024-08-09 06:00:00 发布