定义:
MySQL官方对索引(Index)的定义为:是帮助MySQL高效获取数据的数据结构。
索引可以简单理解为排好序的快速查找数据结构,目的在于提高查找效率,可以类比字典。
索引会形象到where后面的查找和order by后面的排序。
一般索引本身也很大,不可能全部存储在内存中,因此索引常常以索引文件的形式存储在磁盘上。
我们平时所说的索引,如果没有特别指明,都是指 B树 结构组织的索引。其中聚集索引,次要索引,覆盖索引,复合索引,前缀索引,唯一索引都默认使用B+树索引,统称索引。当然,除了B+树这种类型的索引外,还有哈希索引(Hash Index)等。
优势:
类似大学图书馆建书目索引,提高数据检索效率,降低数据库的IO成本;
通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的消耗。
劣势:
实际上索引也是一张表,该表保存了主键和索引字段,并指向实体表的记录,所以索引也要占用空间。
虽然索引大大提高了查询速度,但是却降低了更新表的速度,如对表进行INSERT,UPDATE,DELETE。
索引只是提高效率的一个因素,如果你的MySQL有大数据量的表,就需要花时间研究建立最优秀的索引,或者优化查询。
索引的分类:
1、单值索引:即一个索引只包含单个列,一个表可以有多个单列索引。
2、唯一索引:索引列的值必须唯一,但允许为空值。
CREATE UNIQUE INDEX...
3、复合索引:即一个索引包含多个列
基本语法:
创建: CREATE INDEX indexName on mytable(columnname(length));
ALTER mytable ADD INDEX [indexName] ON(columnname(length));
删除: DROP INDEX [indexName] ON mytable;
查看: SHOW INDEX FROM table_name\G;
哪些情况需要创建索引:
1、主键自动创建唯一索引。
2、频繁作为查询条件的字段应当创建索引。
3、查询中与其他表关联的字段,外键关系建立索引。
4、频繁更新的字段不适合创建索引。
5、where条件里用不到的字段不创建索引。
6、单键和组合索引的选择问题:在高并发下倾向创建组合索引。
7、查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度。
8、查询中统计或分组字段