索引 知识整理

一. 定义
索引是为了加速对表中数据行的检索而创建的一种分散的存储结构。索引是针对表而建立的,它是由数据页面以外的索引页面组成的,每个索引页面中的行都会含有逻辑指针,以便加速检索物理数据。

二.优缺点
优点:
1.大大加快数据的检索速度;
2.创建唯一性索引,保证数据库表中每一行数据的唯一性;
3.加速表和表之间的连接;
4.在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。
缺点:
1.索引需要占物理空间。
2.当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度。

三.索引类型

SQL Sever索引类型有:唯一索引,主键索引,聚集索引,非聚集索引

MySQL 索引类型有:唯一索引,主键(聚集)索引,非聚集索引,全文索引

SQL的主流索引结构有B+树以及Hash结构,聚集索引以及非聚集索引用的是B+树索引

MySQL的MyISAM存储引擎的聚集索引和非聚集索引只多了个唯一约束,其他没什么区别

名词解释:

(1)聚集(clustered)索引,也叫聚簇索引
数据行的物理顺序与列值(一般是主键的那一列)的逻辑顺序相同,一个表中只能拥有一个聚集索引

如果不创建聚集索引,系统会自动创建一个隐含列作为表的聚集索引。
SQL Sever默认主键为聚集索引,也可以指定为非聚集索引,而MySQL里主键就是聚集索引

最好还是在创建表的时候添加聚集索引,由于聚集索引的物理顺序上的特殊性,因此如果再在上面创建索引的时候会根据索引列的排序移动全部数据行上面的顺序,会非常地耗费时间以及性能。

(2)非聚集(unclustered)索引
该索引中索引的逻辑顺序与磁盘上行的物理存储顺序不同,一个表中可以拥有多个非聚集索引

(3)唯一索引(UNIQUE)
是不允许其中任何两行具有相同索引值的索引。可以有NULL值,一个表可以有多个唯一索引。

(4)全文索引(FULLTEXT)
全文索引通常使用倒排索引来实现

旧版的MySQL的全文索引只能用在MyISAM表格的char、varchar和text的字段上

从INNODB1.2.x版本(MySQL5.6.24以上)开始,INNODB存储引擎开始支持全文索引,其支持MyISAM的全部功能,并且还支持其他的一些特性。

使用全文索引需要修改my.cnf 配置文件(全文索引查询关键词最小长度限制等)

(5)主键索引(PRIMARY)
简称为主索引,数据库表中一列或列组合(字段)的值唯一标识表中的每一行。该列称为表的主键。唯一且不能为有NULL值。一个表只能有一个主键索引。

(6)候选索引
符合主索引的要求,但没有被选为表的主索引的索引

与主索引一样要求字段值的唯一性,并决定了处理记录的顺序。在数据库和自由表中,可以为每个表建立多个候选索引

(7)复合索引(联合索引)
索引使用技巧名称,两个或更多个列上的索引被称作复合索引。

(8)前缀索引
索引使用技巧名称,对串列进行索引,如果可能应该指定一个前缀长度。例如,如果有一个CHAR(255)的 列,如果在前10 个或20 个字符内,多数值是惟一的,那么就不要对整个列进行索引。前缀索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。

(8)最左原则
对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分

四.索引使用场合

表的字段唯一约束
直接条件查询的字段
查询中与其它表关联的字段
查询中排序的字段
查询中统计或分组统计的字段

五.索引不适用场合

表记录太少
经常插入、删除、修改的表
数据重复且分布平均的表字段
经常和主字段一块查询但主字段索引值比较多的表字段

六.索引注意事项

(1) 不是什么情况都非得建索引不可,比如性别可能就只有两个值,建索引不仅没什么优势,还会影响到更新速度,这被称为过度索引

(2) mysql查询每次只能使用一个索引

(3) 在创建复合索引时应该将最常用作限制条件的列放在最左边,依次递减

(4) 索引不会包含有NULL值的列
只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为NULL

(5)排序的索引问题
mysql查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引。

(6)like语句操作
一般情况下不鼓励使用like操作,如果非使用不可,如何使用也是一个问题。like “%aaa%” 不会使用索引而like “aaa%”可以使用索引。

(7)不要在列上进行运算

(8) 条件语句中 有 or 会是索引不起作用

(9)EXPLAIN可以帮助开发人员分析SQL问题,explain显示了mysql如何使用索引来处理select语句以及连接表,可以帮助选择更好的索引和写出更优化的查询语句。

(10)不使用NOT IN 、<>、!=操作,但<,<=,=,>,>=,BETWEEN,IN是可以用到索引的

(11)对于那些定义为text、image和bit数据类型的列不应该增加索引。因为这些列的数据量要么相当大,要么取值很少

(12)索引字段类型和sql字段类型需要保持一致,否则索引会无效

猜你喜欢

转载自blog.csdn.net/Fickle_actor/article/details/87180361