1。索引使用的利弊
索引分单列索引和组合索引。
单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索引包含多个列。
创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件)。实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。
优点:提高数据库检索速读
缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。
建立索引会占用磁盘空间的索引文件。
2。索引组织形式
mysql目前主要支持索引类型 fulltext,hash,btree,rtree
1.fulltext 全文索引,mylsam引擎支持。create table,alter table,create index索引使用。char,varchar,text数据类型列可以创建该索引
模糊查询使用:解决where name like "%hehe%"这类文本的模糊查询效率较低的问题
2.hash 键值对形式,具有唯一性,可以一次定位,不像树形索引逐层查找,效率极高。
精确查询使用:在"=和in"条件下使用效率高。范围,排序,组合查询一般不用。
3.btree mysql默认和最常用的索引。排序,组合查询
原理:将索引值按一定的算法,存入一个树形的数据结构中(二叉树),每次查询都是从树的入口root开始,依次遍历节点node,获取叶子节点leaf.
4.rtree 范围查找,rtree比btree具有优势。mysql几乎不用,仅支持geometry数据类型。
mylsam,BDb,innoDb,NDb,Archive几种都支持geometry这个数据类型。
3。索引种类
普通索引:仅加速查询(mysql中基本索引类型,无限制,索引列可插入重复值空置,纯粹为了查询数据更快一点。)
唯一索引:加速查询+列值唯一(可以有null)(如,学号,姓名,可以同时是唯一索引。他们的值唯一,可以空,不重复就行)
主键索引:加速查询+列值唯一(不可以有null)+表中只有一个。
组合索引:多列值组成一个索引,专门用于组合搜索,其效率大于索引合并。
(在表中的多个字段组合上创建的索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用,使用组合索引时遵循最左前缀集合。例如,这里由id、name和age3个字段构成的索引,索引行中就按id/name/age的顺序存放,索引可以索引下面字段组合(id,name,age)、(id,name)或者(id)。如果要查询的字段不构成索引最左面的前缀,那么就不会是用索引,比如,age或者(name,age)组合就不会使用索引查询)
索引合并:使用多个单列索引组合搜索
覆盖索引:select的数据列只用从索引中就能够取得,不必读取数据行,换句话说查询列要被所建的索引覆盖。
聚集(clustered)索引:也叫聚簇索引,是指数据行的物理顺序与列值(一般是主键的那一列)的逻辑顺序相同,一个表中只能拥有一个聚集索引。MySQL中一般默认主键为聚集索引。
非聚集(unclustered)索引:该索引中索引的逻辑顺序与磁盘上行的物理存储顺序不同,一个表中可以拥有多个非聚集索引。
除了聚集索引以外的索引都是非聚集索引,只是人们想细分一下非聚集索引(分成普通索引,唯一索引,全文索引。)
原文链接:https://blog.youkuaiyun.com/qq_39101581/article/details/82461076