参考书籍: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 表名