数据库—索引

什么是索引?

索引是创建在数据库表对象上的,对一个字段或多个关联字段进行排序的结构。索引包含由表或视图中的一列或多列生成的键。这些键以B-数或哈希表的结构存储在磁盘上。

   

索引存储分类:

InnoDBMyISAM都支持B-树索引(BTREE

MySQL索引存储分类:

1B-树索引(BTREE

2、哈希索引(HASH

oracle索引存储分类:

1B-树索引(BTREE

2、位图索引

3、方向键索引

SQLServer索引存储分类

1、聚簇索引

 聚簇索引 : 是按照数据存放的物理位置为顺序的,聚簇索引能提高多行检索的速度,

1:聚集索引根据数据行的键值在表或视图中排序和存储这些数据行。索引定义中包含聚集索引列。每个表只能有一个聚集索引,因为数据行本身只能按一个顺序排序。

2:只有当表包含聚集索引时,表中的数据行才按排序顺序存储。如果表具有聚集索引,则该表称为聚集表。如果表没有聚集索引,则其数据行存储在一个称为堆的无序结构中。      

 2、非聚簇索引

非聚簇索引: 非聚簇索引对于单行的检索很快。

1:非聚集索引具有独立于数据行的结构。非聚集索引包含非聚集索引键值,并且每个键值项都有指向包含该键值的数据行的指针。

2;从非聚集索引中的索引行指向数据行的指针称为行定位器。行定位器的结构取决于数据页是存储在堆中还是聚集表中。对于堆,行定位器是指向行的指针。对于聚集表,行定位器是聚集索引键。

3:您可以向非聚集索引的叶级添加非键列以跳过现有的索引键限制(900 字节和 16 键列),并执行完整范围内的索引查询。

   

 常用的6类索引:

1:普通索引

允许在定义索引的列中插入重复的值和空值,唯一任务是访问速度,因此常出现WHERE和ORDER BY 语句中。

2:唯一索引:UNIQUE

不允许两行具有相同的值,索引列数据不能重复。 例如在身份证列创建唯一索引之后,该表会拒绝接受重复的 身份证号码。但是允许空值。 若创建唯一约束,则自动创建唯一索引,尽管唯一索引有助 于找到信息,但是为了最佳性能仍然建议使用主键约束。

3:主键索引:

  在数据库关系图中为表定义主键,则自动创建主键索引,主键索引是唯一索引的特殊类型。主键列每个值,非空,唯一在查询中使用主键索引时,允许快速访问。

4:复合索引:

 对多个列组合创建索引,只有在查询中使用了组合索引最左边的字段时,索引才被使用,即第一个字段作为前缀的集合

5:全文索引:FULLTEXT

 支持值的全文查找,允许这些索引列中插入重复值和空值,可以在HCAR,VACHAR,TEXT类型的列上创建,主要用于大量文本文字中搜索字符串,效率比使用SQL和LIKE高,

 MySQL4.5中只有MyISAM支持全文索引。

6:空间索引:SPATIAL

 对空间类型的列创建的索引,如GEOMETRY,POINT等,创建空间索引的列必须声明为NOT NULL,只能在MyISAM存储引擎表中创建。  

   

1:创建索引

修改表结构:

ALTER TABLE student ADD INDEX (english) ;

创建表的时候建索引:

CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, INDEX [indexName] (username(length)) );

CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name

ON table_name (column_name[length]…);

---------------------------------------------------

UNIQUE|FULLTEXT|SPATIAL

分别表示唯一索引,全文索引,空间索引,为可选参数

index_naem:指定索引名

table_name:指定创建索引的表名

column_name:指定创建索引的列名

length:指定索引长度,可选参数,只有字符串类型才能指定

   

2:删除索引

DROP INDEX index_name ON table_name;

注意事项:

1:删除表时,索引同时被删除

2:删除表的列时,如果删除的列为索引的组成部分,该列会从索 引中删除,直到索引中的列全部被删除了,索引才被删除。

   

3:查看索引

SHOW INDEX FROM table_nameG;  G可省

    

如何合理创建索引?

1:频繁搜索的列

2:常作为查询选择的列where后面

3:经常排序分组的列 order by

4:经常作为连接的列(主键、外键

5. 值不会经常修的列

能用于创建索引的列:

1:仅包含几个不同的值

2:仅包含几行记录(浪费资源和时间,得不偿失)

 使用索引的经验:

1:查询时减少使用*全部返回,不要返回不需要的列

2:索引应该尽量小,在字节数小上建立索引

3WHERE子句中有多个条件表达式时,包含索引的表达式应该放在其它条件表达式之前。

4:避免在ORDER BY 子句中使用表达式。(索引会失效的)

5:根据业务数据发生频率,定期重新生成或重新组织索引,进 行碎片整理。

   

对于一个多列索引,如果在WHERE子句的所有AND层次使用索引,将不使用来索引优化查询。为了能够使用索引优化查询,必须把一个多列索引的前缀使用在一个AND条件组中。

        

下列WHERE子句使用索引:

             

... WHERE index_part1=1 AND index_part2=2

           

... WHERE index=1 OR A=10 AND index=2 /* index = 1 OR index = 2 */

       

... WHERE index_part1='hello' AND index_part_3=5

          

/* optimized like "index_part1='hello'" */

         

这些WHERE子句不使用索引:

             

... WHERE index_part2=1 AND index_part3=2 /* index_part_1 is not used */

       

... WHERE index=1 OR A=10 /* No index */

       

... WHERE index_part1=1 OR index_part2=10 /* No index spans all rows */

       

    

如果LIKE参数是一个不以一个通配符字符起始的一个常数字符串,MySQL也为LIKE比较使用索引。

    

例如,下列SELECT语句使用索引:

         

mysql> select * from tbl_name where key_col LIKE "Patrick%";

      

mysql> select * from tbl_name where key_col LIKE "Pat%_ck%";

      

在第一条语句中,只考虑有"Patrick" <= key_col < "Patricl"的行。在第二条语句中,只考虑有"Pat" <= key_col < "Pau"的行。

下列SELECT语句将不使用索引:

         

mysql> select * from tbl_name where key_col LIKE "%Patrick%";

      

mysql> select * from tbl_name where key_col LIKE other_col;

      

在第一条语句中,LIKE值以一个通配符字符开始。在第二条语句中,LIKE值不是一个常数。

    

  

原文地址:https://www.cnblogs.com/domi22/p/8059434.html