Mysql学习笔记-索引

参考书籍:Mysql核心技术与最佳实践 /孔祥盛编著. -北京:人民邮电出版社,2014.5 ISBN 978-7-115-33769-6

一、概念

类似《新华字典》,biang也[不]会在其中。“音节表:按照a->z顺序排序,因此读者可以很快找到biang字的页数。

1、索引的本质

索引其实是数据库表中字段值的复制,该字段称为索引的关键字。

2、Mysql数据库中,数据是如何检索的?

Mysql在检索表中数据时,先按照索引“关键字”的值在索引中进行查找,如果能查到,则直接定位到数据所在的起始页;如果没有查到,只能全表扫描查找数据。

3、一个数据表可以创建多个索引

4、前缀索引

索引中关键字的值可以是索引“关键字”字段值的一部分,这种索引称为前缀索引。

5、索引必须来自同一张表,关键字值必须是表中相应字段值拷贝。为了提高效率,需要对索引的关键字排序。

6、不能跨表创建索引

7、索引经排序后存放在外存文件中

8、由于表主键不会重复,所以主键做索引是最合适的。

对于MyISAM表:

mysql会自动将表中所有记录主键值的“备份”及每条记录所在起始页编入索引,形成一张“索引表”并存入外存,这种索引也称为“主索引”(primary index)。MyISAM表的MYI索引文件与MYD数据文件位于两个文件,通过MYI索引文件中的“表记录指针”可以找到MYD数据文件中表记录所在的物理地址。

对于InnoDB表:

“主索引”与MyISAM表主索引不同。InnoDB表“主索引”关键字顺序必须与InnoDB表记录主键值顺序一致,这种“主索引”称为“聚簇索引”。对于InnoDB表,必须有且仅一个聚簇索引。其表记录和索引位于同一个表空间文件,聚簇索引就是InnoDB表。非聚簇索引统称为“辅助索引”,“辅助索引”表记录称为书签,实际上是主键值。

9、索引与数据结构关系

索引通常使用平衡树(btree)或哈希表等复杂的数据结构。

10、索引是冗余数据,并非越多越好。

二、关键字选取原则

1、字段值离散程度越高越适合

2、占用存储空间少的字段更适合

3、固定存储空间的字段更适合

4、where子句经常使用的应该创建索引,分组字段、排序字段应该创建索引。

5、更新频繁的字段不适合创建索引

6、最左前缀原则

7、尽量使用前缀索引

三、索引与约束

主键约束、唯一性约束、外键约束与索引的联系较为紧密。

约束用于保证数据逻辑操作完整性,索引则是将关键字以某种结构存于外存,提升检索性能。

主键约束、唯一性约束、外键约束是基于索引实现的。因此创建主键约束时,会自动创建一个主索引,且主索引与主键约束名相同(PRIMARY);创建唯一性约束时,会自动创建唯一性索引,索引名与唯一性约束名相同;外键约束也一样。

当然,删除唯一性索引,对应的唯一性 约束也将自动删除。

四、创建索引

1、方法一:创建表同时创建索引

create table 表名(
字段名 数据类型 [约束条件]
...
[其它约束条件]
...
[unique |fulltext] index 索引名  (字段名[(长度)] [asc | desc])
)engine = 存储引擎类型 default chaset =字符集类型

 

2、方法二:在已有表上创建索引

create [unique |fulltext] index 索引名 on 表名 (字段名[(长度)] [asc | desc])
alter table 表名 add [unique |fulltext] index 索引名  (字段名[(长度)] [asc | desc])

三、删除索引

drop index 索引名 on 表名