MySql – 索引
1.什么是索引
2.为什么要创建索引/索引的优点
3.索引的缺点
4.索引的类型
5.什么样的字段适合创建索引
6.什么样的字段不适合创建索引
---------------------------------------------------------------------------------------------------------------------------
1.什么是索引
引用百度百科的概念:在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。通俗点说,是存储引擎快速找到记录的一种数据结构。
2.为什么要创建索引/索引的优点
2.1 通过创建唯一性索引,可以保证数据表中每一行数据的唯一性。
这句话是什么意思呢?其实保证数据唯一性最终也会映射到查询效率上。我们都知道,做查询的时候,如果我们的查询条件是一个主键,那么这条查询SQL的执行效率一定比查询条件为一个非主键效率要高。这是因为MySql中存在自动创建聚簇索引的能力,MySql会先找主键,如果没有主键再找存在唯一性约束的,如果上述都没有的话则会生成一个默认的索引键。这说明,只要我们用主键查,就一定会走索引。其实索引中的值,最终会换算成数据存在磁盘上的物理位置,最终找到所查询的数据。上面啰嗦了一大堆,总结下就是:创建唯一性索引,走主键查询可以走索引,进而提高查询效率。
2.2 可以加快数据的检索速度
这个没啥可说的,走索引一定比扫描全表检索速度快呀,要不还专门弄一个索引干啥。
2.3 加速表与表之间的连接,物别是在实现数据的参考完事性方面特别有意义
我们在建外键的时候,外键所参照的列必须是一个主键(虽然现在很少使用强关联了,因为在分库分表的时候会遇到麻烦),所以正因为有这样一个约束存在,所以在做表与表连接的时候,速度肯定要快一些。
2.4 在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间
这句话同学们先记下来,我们下面讲到“什么样的字段适合创建索引”的时候会说这个问题。
2.5 通过使用索引,可以在时间查询的过程中,使用优化隐藏器,提高系统的性能
首先明白优化器是什么,优化器是MySql架构中的一环,他的作用是优化SQL的执行计划,是否建立索引会对SQL的执行计划产生较大的影响。
3.索引的缺点
3.1 创建索引和维护索引要耗费额外时间
3.2 索引需要占据额外的物理空间
3.3 当表中的数据进行增、删、改的时候,也需要同时对索引进行维护,降低了数据的维护速度
4.索引的类型
MsSql中索引一共有四种类型,分别为:普通索引(NORMAL)、唯一索引(UNIQUE)、全文索引(FULLTEXT)、空间索引(SPATIAL)。
4.1 普通索引(NORMAL):即不应用任何限制条件的索引,该索引可以在任何数据类型中创建。比如我们最常见的创建索引的语句
CREATE INDEX index_name ON table(column(length))
4.2 唯一索引(UNIQUE):表示唯一的,不允许重复的索引,如果该字段数据保证不会重复,可设置为unique索引
CREATE UNIQUE INDEX indexName ON table(column(length))
4.3 全文索引(FULLTEXT):主要用来查找文本中的关键字,而不是直接与索引中的值相比较。fulltext索引跟其它索引大不相同,它更像是一个搜索引擎,而不是简单的where语句的参数匹配。fulltext索引配合match against操作使用,而不是一般的where语句加like。
CREATE TABLE `table` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`title` char(255) CHARACTER NOT NULL ,
`content` text CHARACTER NULL ,
`time` int(10) NULL DEFAULT NULL ,
PRIMARY KEY (`id`),
FULLTEXT (content)
);
4.4 空间索引(SPATIAL):空间索引是对空间数据类型的字段建立的索引,MYSQL中的空间数据类型有4种,分别是GEOMETRY、POINT、LINESTRING、POLYGON。MySql使用SPATIAL关键字进行扩展,使得能够用于创建正规索引类型的语法创建空间索引。创建空间索引的列,必须将其声明为NOT NULL,空间索引只能在存储引擎为MYISAM的表中创建。
5.什么样的字段适合创建索引
5.1 在经常需要索引的列上,可以加快搜索的速度
5.2 在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构
翻译一下就是:能用主键去查就用主键去查
5.3 在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的
这是因为MySql在存索引的时候,使用的是B+TREE(平衡多路查找树+链表),因为叶子节点链表支持范围查找走索引(知道开始节点和结束的节点,可以直接取出一段链表),所以在查询的时候可以直接走排序好的索引。
5.4 在经常需要排序的列上创建索引,因为所以已经排序,这样查询可以利用索引的排序,加快速度检索效率
5.5 在经常使用Where子句中的列上建立索引,加快条件的判断速度
6.什么样的字段不适合创建索引
6.1 对于那些在查询中很少使用或者参考的列不应该创建索引
原因很容易理解,这些列很少使用到,那么有索引或者无索引,并不能提高查询速度。
6.2 对于那些数据值类型很少的列也不应该增加索引
比如一个标志位字段,U:为使用 E:为失效,那么在这一列上建立索引进行检索数据的时候,会在整个表中检索出很多行数据(因为这个字段的值只有这两种),在这种情况下,增加索引,并不能显著的加快检索效率(因为检索出的数据行数在表中占了大部分比例)。
6.3 索引应该建在小字段上,对于大的文本字段甚至超长字段(text,、image、bit),不要建索引
这是因为,这些列的数据量要么相当大,要么取值很少。
6.4 更新十分频繁的字段上不宜建立索引
这是因为更新操作会变更B+树,重建索引。整个过程是十分消耗数据库性能的。
6.5 区分度不大的字段上不宜建立索引
类似于性别这种区分度不大的字段,建立索引的意义不大。因为不能有效过滤数据,性能和全表扫描相当。