什么是索引?
索引是创建在数据库表对象上的,对一个字段或者多个关联字段进行排序的结构。索引包含由表或者视图中的一列或者多列生成的键。这些键以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_nameG; 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值不是一个常数。 |