数据库中为何要建立索引?
这个问题对于做做简单实验的学生来说似乎并不需要过于了解,但是,如果处理的数据达到百万以及以上的时候,合适的索引就能够体现出很强大的优势(MYSQL默认使用B+树索引)。
创建索引的三种方式:
三种方式:
1. CREATE INDEX index_name ON table_name (column_name).
2. ALTER TABLE ADD index indexname [index_type] (column_name).
3. 建表的时候在后面附上
4. 建立索引时可以指定索引是升序或者降序。
CREATE INDEX PersonIndex ON Person (LastName DESC) ;
如果字段的属性为字符串,限制length的大小可以有效的提高查询速率。
如长度为7的char型字段,在索引中可以设置为比7要小的长度。
5.建立组合索引:
建立组合索引在某些情况下会起到很好的效果。
CREATE INDEX PersonIndex ON Person (LastName, FirstName)
6.删除索引
DROP INDEX [indexName] ON mytable;
7.组合索引的一些注意事项:
比如对于如下的表:
CREATE TABLE People (
last_name varchar(50) not null,
first_name varchar(50) not null,
dob date not null,
gender enum('m', 'f') not null,
);
如果在last_name、first_name和dob上建立一个组合索引。
使用上述索引时有以下一些限制:
(1) 查询必须从索引的最左边的列开始。例如你不能利用索引查找在某一天出生的人。
(2) 不能跳过某一索引列。例如,你不能利用索引查找last name为Smith且出生于某一天的人。
Mysql中的索引类型:
1.Full Text(全文索引)
全文索引并不是和MyISAM一起诞生的,它的出现是为了解决WHERE name LIKE “%word%”这类针对文本的模糊查询效率较低的问题。在没有全文索引之前,这样一个查询语句是要进行遍历数据表操作的,可见,在数据量较大时是极其的耗时的。
对搜索引擎稍微有点了解的同学,肯定知道分词这个概念,FULLTEXT索引也是按照分词原理建立索引的。西文中,大部分为字母文字,分词可以很方便的按照空格进行分割。但很明显,中文不能按照这种方式进行分词。那又怎么办呢?这个向大家介绍一个Mysql的中文分词插件Mysqlcft,有了它,就可以对中文进行分词,当然还有其他的分词插件可以使用。
2.Hash索引
Hash索引能够存在的最大原因在于其能够很快的定位而不是逐层寻找,具有极高的效率,当然其本身也有一些缺点:
Hash索引引用文章
(1)Hash 索引仅仅能满足”=”,”IN”和”<=>”查询,不能使用范围查询。
由于 Hash 索引比较的是进行 Hash 运算之后的 Hash 值,所以它只能用于等值的过滤,不能用于基于范围的过滤,因为经过相应的 Hash 算法处理之后的 Hash 值的大小关系,并不能保证和Hash运算前完全一样。
(2)Hash 索引无法被用来避免数据的排序操作。
由于 Hash 索引中存放的是经过 Hash 计算之后的 Hash 值,而且Hash值的大小关系并不一定和 Hash 运算前的键值完全一样,所以数据库无法利用索引的数据来避免任何排序运算;
(3)Hash 索引不能利用部分索引键查询。
对于组合索引,Hash 索引在计算 Hash 值的时候是组合索引键合并后再一起计算 Hash 值,而不是单独计算 Hash 值,所以通过组合索引的前面一个或几个索引键进行查询的时候,Hash 索引也无法被利用。
(4)Hash 索引在任何时候都不能避免表扫描。
前面已经知道,Hash 索引是将索引键通过 Hash 运算之后,将 Hash运算结果的 Hash 值和所对应的行指针信息存放于一个 Hash 表中,由于不同索引键存在相同 Hash 值,所以即使取满足某个 Hash 键值的数据的记录条数,也无法从 Hash 索引中直接完成查询,还是要通过访问表中的实际数据进行相应的比较,并得到相应的结果。
(5)Hash 索引遇到大量Hash值相等的情况后性能并不一定就会比B-Tree索引高。
对于选择性比较低的索引键,如果创建 Hash 索引,那么将会存在大量记录指针信息存于同一个 Hash 值相关联。这样要定位某一条记录时就会非常麻烦,会浪费多次表数据的访问,而造成整体性能低下。
3.B+树索引