索引:
在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。
索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序。数据库使用索引以找到特定值,然后顺指针找到包含该值的行。这样可以使对应于表的SQL语句执行得更快,可快速访问数据库表中的特定信息。
当表中有大量记录时,若要对表进行查询,第一种搜索信息方式是全表搜索,是将所有记录一一取出,和查询条件进行一一对比,然后返回满足条件的记录,这样做会消耗大量数据库系统时间,并造成大量磁盘I/O操作;第二种就是在表中建立索引,然后在索引中找到符合查询条件的索引值,最后通过保存在索引中的ROWID(相当于页码)快速找到表中对应的记录。
索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。如果想按特定职员的姓来查找他或她,则与在表中搜索所有的行相比,索引有助于更快地获取信息。
索引的一个主要目的就是加快检索表中数据,亦即能协助信息搜索者尽快的找到符合限制条件的记录ID的辅助数据结构。
索引的优点:
1.通过建立索引可以极大地提高在数据库中获取所需信息的速度,同时还能提高服务器处理相关搜索请求的效率,从这个方面来看它具有以下优点:
2.设计数据库时,通过创建一个惟一的索引,能够在索引和信息之间形成一对一的映射式的对应关系,增加数据的惟一性特点。
3.能提高数据的搜索及检索速度,符合数据库建立的初衷。
4.能够加快表与表之间的连接速度,这对于提高数据的参考完整性方面具有重要作用。
5.在信息检索过程中,若使用分组及排序子句进行时,通过建立索引能有效的减少检索过程中所需的分组及排序时间,提高检索效率。
mysql索引:是mysql的一种数据结构,可以提高查询的效率,需要占用一定空间的存储。mysql索引分为不同的种类,不同类型的索引查询效率不同,不同类型的存储引擎支持的索引类型也不同
mysql的数据表大多使用btree类型的索引
存储引擎支持 每个表至少16个索引 总索引长度至少256字节
bree索引
(1)所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好是有序的
(2)非叶子结点存储的是叶子结点的索引(稀疏索引),叶子结点存储的是关键字和数据
(3)非叶子结点不能存数据
(4)顺序存储,每一个叶子节点到根结点的距离是相同的
(5)根节点横向也有链指针
可以用Btree索引进行全关键字、关键字范围和关键字前缀查询。如果使用索引,必须保证按索引最左边前缀进行查询。由于Btree中节点是顺序存储的,可以对查询结果进行order by。
限制:
(1)查询必须从索引的最左边的列开始
(2)不能跳过某一索引列。
(3)存储引擎不能使用索引中范围条件右边的列。
例如,如果你的查询语句为WHERE last_name=”Smith” AND first_name LIKE ‘J%’ AND dob=’1976-12-23’,则该查询只会使用索引中的前两列,因为LIKE是范围查询。
hash索引
简单地说,哈希索引就是采用一定的哈希算法,把键值换算成新的哈希值,检索时不需要类似B+树那样从根节点到叶子节点逐级查找,只需一次哈希算法即可立刻定位到相应的位置,速度非常快。
从上面的图来看,Btree索引和Hash索引的明显区别是:
(1)如果是等值查询,那么哈希索引明显有绝对优势,因为只需要经过一次算法即可找到相应的键值;当然了,这个前提是,键值都是唯一的。如果键值不是唯一的,就需要先找到该键所在位置,然后再根据链表往后扫描,直到找到相应的数据;
(2)从示意图中也能看到,如果是范围查询检索,这时候哈希索引就毫无用武之地了,因为原先是有序的键值,经过哈希算法后,有可能变成不连续的了,就没办法再利用索引完成范围查询检索;
同理,哈希索引也没办法利用索引完成排序,以及like ‘xxx%’ 这样的部分模糊查询(这种部分模糊查询,其实本质上也是范围查询);
(3)哈希索引也不支持多列联合索引的最左匹配规则;
(4)Btree的关键字检索效率比较平均,不像Hash那样波动幅度大,在有大量重复键值情
况下,哈希索引的效率也是极低的,因为存在所谓的哈希碰撞问题。
增加索引优势:
1,加快查询速度
2,创建唯一索引来保证数据表中数据的唯一性
3,实现数据的完整性,加速表和表之间的连接
4,减少分组和排序的时间
索引的分类:
唯一索引
主键索引:创建索引的字段如果有主键约束,那么该字段会自动变为主键索引,也可以对一个普通字段添加主键索引,要求字段值非空且唯一,主键索引是特殊的唯一索引
唯一索引:创建索引的字段如果有主键约束,那么该字段会自动变为唯一索引,也可以对一个普通字段添加唯一索引,要求字段值唯一
单列索引:对指定的字段添加索引,对索引字段的值没有要求
组合索引:对多个字段组合在一起创建一个索引
全文索引:指定对myisam存储引擎表创建全文索引,并且要求全文索引字段的数据类型为字符串类型(char,varchar),可以对索引字段的值进行全文查找,一般用于文章类型的数据的搜索
三、创建索引的规则
(1)创建索引并非 ' 是越多越好
(2)数据量小得表最好不要创建索引
(3)避免对经常更新的数据创建索引
(4)在条件表达式中经常用到的不同值较多的列创建索引
(5)当唯一性是某种数据本身的特征时,我们创建唯一性索引
(6)在频繁进行排序或分组的列上建立索引,如果排序的列有多个,可以创建全文索引
#查看数据表创建的索引信息
show index from 表名\G
主键索引 创建主键 就相当于创建了一个索引
主键属于索引中一种 在数据库关系表中为表定义主键将自动创建主键索引,主键所以是唯一索引的类型 该索引要求主键中的每个值都是唯一的 当在查询中使用主键索引,可以加快数据的访问
主键索引的创建
四、创建索引的语法
4.1 Create table 表名[字段名 数据类型] [unique唯一索引|fulltext全文索引|spatial空间索引] [index|key] [索引名]
(col_name [length]) [asc |desc]
创建索引
主键索引
主键属于索引当中的一种 因为主键有非空且唯一的特性,在使用主键索引时,会先通过主键来查找数值 常用的索引 效率比较高的索引
用法
create table 表名 (
字段 数据类型 [完整约束条件]
primary key 索引名 (字段)
);
mysql> create table pri_inx (
-> a int,
-> b int,
-> primary key p_inx(a)
-> );
Query OK, 0 rows affected (0.02 sec)
mysql> show index from pri_inx\G
唯一索引 唯一索引效率稍低于主键索引 没有非空的约束
create table 表名 (
字段 数据类型 [完整约束条件]
unique index 索引名 (字段)
);
mysql> create table un_inx (
-> a int,
-> b int,
-> unique index u_inx(a)
-> );
mysql> show index from un_inx\G
单列索引 也就是普通索引
没有唯一和非空的约束
create table 表名 (
字段 数据类型 [完整约束条件]
index 索引名 (字段)
);
mysql> create table i_inx (
-> a int,
-> b int,
-> index i_inx(a)
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> show index from i_inx\G
组合索引 多个字段创建一个索引 最左原则
create table 表名 (
字段 数据类型 [完整约束条件]
key mulitinx (字段名)
);
mysql> create table m_inx (
-> a int,
-> b int,
-> c int,
-> key mulitinx(a,b)
-> );
mysql> show index from m_inx\G
全文索引 可以用来做全文搜索 mysql5.6.5myisam 全文索引 5.6.5版本之后innodb也实现能都做全文索引 字段的数据类型 只能是 char varchar text
create table 表名 (
字段 数据类型 [完整约束条件]
fulltext index (字段名)
);engine=myisam
mysql> create table f_inx (
-> a char(10),
-> b int,
-> fulltext index f_inx(a)
-> );
Query OK, 0 rows affected (0.14 sec)
mysql> show index from f_inx\G
添加索引
mysql> alter table students add index test(s_name);
Query OK, 0 rows affected (0.36 sec)
Records: 0 Duplicates: 0 Warnings: 0
删除索引
mysql> alter table students drop index test;
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0