数据库--索引

什么是索引?

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

索引存储分类:

InnoDB和MyISAM都支持B-树索引(BTREE)

Mysql索引存储分类:

1.B-树索引(BTREE)

2.哈希索引(HASH)

oracle索引存储分类:

1.B-树索引(BTREE)

2.位图索引

3.方向键索引

SQLServer索引存储分类

1.聚簇索引

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

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

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

2.非聚簇索引

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

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

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

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

常见的6类索引

1:普通索引

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

2.唯一索引  UNIQUE

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

3.主键索引

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

4.复合索引

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

5.全文检索:FULLTEXT

  支持值的全文查找,允许这些索引列中插入重复值和空值,可以在CHAR、VARCHAR、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_name\G;  \G可省

   

如何合理创建索引?

1:频繁搜索的列

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

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

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

5. 值不会经常修改的列

能用于创建索引的列:

1:仅包含几个不同的值

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

 使用索引的经验:

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

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

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

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值不是一个常数。

猜你喜欢

转载自www.cnblogs.com/blacksmallcat/p/10157347.html